2011-01-11 6 views
2

Ich mache zur Zeit eine wirklich ungeschickt Schleife über alle Objekte, aber das wird langsam bekommen werde:Wie bekomme ich alle Objekte, für die ein Benutzer bestimmte Berechtigungen hat, in django guardian?

videos = Video.objects.all() 
video_list = [] 
for video in videos: 
    checker = ObjectPermissionChecker(request.user) 
    if checker.has_perm('view_video', video): 
     video_list.append(video) 

ich dort Abbildung dieser Benutzer hat Berechtigung, um die Objekte alle sein müssen, für die eine Art und Weise nur zu bekommen.

Antwort

7

vor ein paar Tagen gab es ein Update mit neuer Abkürzung Funktion namens "get_objects_for_user". Wenn Sie eine ältere Version des Erziehungsberechtigten verwenden und nicht aktualisieren können, können Sie einfach Codes von dort kopieren.

from guardian.shortcuts import get_objects_for_user 
... 
videos = get_objects_for_user(request.user, "view_video", Video.objects.all()) 

Es immer 3 Abfragen. Wenn Sie den Parameter "use_groups" auf "False" festlegen, werden 2 Abfragen ausgeführt. Das zurückgegebene "queryset" enthält jedoch keine Objekte, für die Benutzergruppen Berechtigungen besitzen. Sie können auch eine Liste von Codenamen angeben, anstatt eine einzelne Berechtigung, falls erforderlich. Read more here.

+0

Das ist perfekt. Vielen Dank. Kann ich mit easy_install django-guardian updaten? – willcritchlow

+0

Mach dir keine Sorgen - ich habe pip install --upgrade verwendet, das scheint gut zu funktionieren. – willcritchlow

+0

... und gibt ein query_set zurück. Süss! Vielen Dank! –

1

Sie wissen, dass Sie eine neue Instanz von ObjectPermissionChecker in jeder Schleife erstellen, während Sie dies nicht tun müssen, und ich werde vorschlagen, etwas zu tun, das syntaktisch Zucker sein kann und Ihnen vielleicht mehr Geschwindigkeit geben kann

checker = ObjectPermissionChecker(request.user) 

videos = Video.objects.all() 

video_list = [video for video in videos if checker.has_perm('view_video', video)] 

für Ihre Frage können Sie django-object-permissionshere für weitere Einzelheiten sehen verwenden, wie zu verwenden.

1

Wenn Sie wollen, drastisch beschleunigen, warum nicht jus die Datenbank ziehen fragen nur die Objekte, die Sie interessiert,

content_type = ContentType.objects.get_for_model(Video) 
perm = Permissions.objects.get(codename='view_video'.split('.')[-1]) 

objs = set(
    UserObjectPermissions.objects.filter(user=user, permission=perm, content_type=content_type) 
) 

# and if you want to include groups 
objs.update(
    set(
     GroupObjectPermissions.objects.filter(group__user=user, permission=perm, content_type=content_type) 
    ) 
) 

Dies sollten Sie alle Benutzer-Objekte erhalten, die der Benutzer über die Berechtigung sowohl durch hat ihr Benutzer und ihre Gruppe.

Verwandte Themen