2016-04-27 5 views
0

Ich möchte meinem Abfrage-Set ein zusätzliches Feld hinzufügen, das sich auf eine bestimmte Berechtigung bezieht. Ist es möglich, "has_perm" in einem CASE zu verwenden?ist es möglich, "has_perm" innerhalb eines CASE-Querysets in Django zu verwenden?

var_group = Group.objects.all().annotate(mypermission=Case(
When(self.has_perm('app.mypermission'), then=Value(True)), 
default=Value(False), 
output_field=BooleanField(), 
)) 

Der Fehler ist:

'Selbst' globaler Name ist nicht definiert

Antwort

1

self ist nicht definiert. Die self, die Sie in der annotate verwendet haben, ist nicht das Objekt Group. Das Abfrage-Set dient zum Erstellen von SQL-Abfragen. Die has_perm ist kein Teil der Abfrage Erstellung. Es ist eine Group Objektmethode.

Also, die Antwort ist ja.

var_group = Group.objects.all().annotate(mypermission=Case(
When(permissions__codename='app.permission', then=Value(True)), 
default=Value(False), 
output_field=BooleanField(), 
)) 

Es gibt eine andere Lösung. Ich schlage vor, das gesamte Group Objekt abzufragen, dann iteriere es eins nach dem anderen, um es zu kommentieren.

var_group = Group.objects.all() 

for group in var_group: 
    if group.permissions.filter(codename='app.permission').exists(): 
     group.mypermission = True 
    else: 
     group.mypermission = False 
+0

Das ist eine gute Idee. Ich habe gerade bemerkt, dass die Gruppe nicht die Methode "has_perm" hat, die nur auf den Benutzer bezogen ist. ** "Group" -Objekt hat kein Attribut "has_perm" **. Irgendeine Idee, diese Methode für die Gruppe zu verwenden? – Steve

+0

Ahhh Sie haben das Modell der Django-Gruppe https://docs.djangoproject.com/es/1.9/ref/contrib/auth/#group-model verwendet. Es hat keine 'has_perm'-Methode. Ich werde die Antwort aktualisieren. –

+0

Die zweite Option ist perfekt: nur (Codename = 'app.permission') funktioniert nicht, ich benutzte (Codename = 'Erlaubnis') – Steve

Verwandte Themen