2011-01-11 45 views

回答

7

前几天有更新新的快捷方式函数称为“get_objects_for_user”。如果您使用较旧版本的监护人并且无法更新,您可以简单地从那里复制代码。

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

它总是做3个查询。如果将“use_groups”参数指定为False,则执行2个查询,但返回的queryset不包含用户组具有权限的对象。您也可以指定代码名称列表,而不是单个权限(如果需要)。 Read more here

+0

这是完美的。谢谢。我可以使用easy_install django-guardian进行更新吗? – willcritchlow 2011-01-16 08:06:41

1

你知道你在每个循环中创建一个ObjectPermissionChecker的新实例,而你不需要这样做,并且我会建议做一些类似这样的事情,它可以更加语法上的糖,也许可以给你更多的速度

checker = ObjectPermissionChecker(request.user) 

videos = Video.objects.all() 

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

对于你的问题,你可以使用django-object-permissionshere有关如何使用的详细信息。

1

如果你想为什么不强制要求数据库拉只有你感兴趣的对象大幅加快,

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) 
    ) 
) 

这应该让你,用户必须通过两种权限的所有用户对象他们的用户和组。

相关问题