如何在django监护人中获取用户具有特定权限的所有对象?

时间:2011-01-11 23:05:02

标签: python django permissions

我目前正在对所有对象进行一个非常笨拙的循环,但这会变慢:

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)

我认为必须有一种方法可以获得该用户拥有权限的所有对象。

3 个答案:

答案 0 :(得分:9)

前几天有一个名为“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个查询,但返回的查询集将不包含用户组具有权限的对象。您还可以指定代码列表,而不是根据需要指定单个权限。 Read more here

答案 1 :(得分: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-permissions查看here了解有关如何使用的更多详细信息。

答案 2 :(得分: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)
    )
)

这应该为您提供用户有权通过其用户和组访问的所有用户对象。