我目前正在对所有对象进行一个非常笨拙的循环,但这会变慢:
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)
我认为必须有一种方法可以获得该用户拥有权限的所有对象。
答案 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)
)
)
这应该为您提供用户有权通过其用户和组访问的所有用户对象。