2012-06-19 6 views
5

Ich arbeite an einem Produkt, das es verschiedenen Schulen erlaubt, ihre Inhalte online zu verwalten.Django Gruppen und Berechtigungen. Gruppen erweitern um einen FK zu haben?

Ein Teil davon beinhaltet die Einrichtung einer rollenbasierten Zugriffskontrolllogik, die ich selbst geschrieben habe. Im Grunde hat jede Schule ihre eigenen Rollen, die ihre eigenen Berechtigungen haben. Ein Benutzer der Software könnte jederzeit mehreren Schulen mit unterschiedlichen Rollen angehören.

Aus verschiedenen Gründen möchte ich dies ablehnen und stattdessen Djangos Gruppen und Berechtigungen zusammen mit einer Bibliothek wie django-guardian verwenden. Das Problem, mit dem ich konfrontiert bin, ist, wie ich das Gruppenmodell erweitern soll, so dass ich einen Fremdschlüssel in jede neue Schule aufnehmen kann und immer noch die Hilfsmethoden in Django und auch Bibliotheken wie django-guardian verwenden kann.

Eine mögliche Herangehensweise ist, einfach Gruppen basierend auf Ereignisnamen wie "Schule 1 - Admin", "Schule 1 - Lehrer", "Schule 2 - Admin", "Schule 2 - Lehrer" und zu erstellen Abfrage Berechtigungen stattdessen auf dieser Grundlage. Gibt es einen guten Grund, warum ich es nicht so machen sollte?

+0

möglich Duplikat von [Django One-to-Many-Beziehung] (http://StackOverflow.com/questions/10975140/Django-one-to-many-relation) – jpic

Antwort

0

Warum nicht beide Ansätze mischen? Django-Modell ermöglicht inheritence. Definieren Sie zuerst das Modell Role mit zulässigen Rollen und einem Schulmodell.

Sie können dann ein neues Modell von django.contrib.auth.Group sagen GroupRole erben. Django erstellt eine neue db-Tabelle für Ihr Modell, die nur die Eigenschaften enthält, die ursprünglich nicht in der Gruppe mit einem Fremdschlüssel für die entsprechende Gruppe mit Einschränkungen enthalten sind. Noch besser ist, erhalten Sie eine automatische umgekehrte Beziehung zu dem ursprünglichen Gruppenmodell erhalten, so können Sie schreiben, so etwas wie:

class GroupRole(Group): 
    role = models.ForeignKey(Role) 
    school = models.ForeignKey(School) 
    ... 

g = Group.objects.get(id=1) 
# you can access standard group items here g.<attribute> or g.grouprole.<attribute> 
# you can access GroupRole attributes by doing g.grouprole.<some_attribute> 

GroupRole.objects.filter(role__type='admin', school__location__state='NY') 

Auf einer Spaßanmerkung ist die Beziehung reflektierend, so etwas wie dies gültig ist, wenn nicht zu nützlich:

g.grouprole.grouprole.grouprole.grouprole.role 

Wenn Sie eine Basisgruppeninstanz erhalten, die keine grouprole Proxy mit ihm verbunden hat, dann werden Sie eine Ausnahme ausgelöst erhalten:

g = Group.objects.create(name='myplaingroup') 
try: 
    print g.grouprole 
except GroupRole.DoesNotExist: 
    print 'This is a normal group' 

Alternativ Sie können dieses Verhalten überschreiben, um None zurückzugeben, anstatt eine Ausnahme auszulösen oder stattdessen eine Standard-GroupRole bereitzustellen.

Verwandte Themen