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

Python 如何在django guardian中获取用户具有特定权限的所有对象?,python,django,permissions,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) 我想一定有一种方法可以获取此用户拥有权限的所

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

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)

我想一定有一种方法可以获取此用户拥有权限的所有对象。

您知道,您正在每个循环中创建一个新的
ObjectPermissionChecker
实例,而不必这样做,我会建议你做一些类似的事情,在句法上更具糖分,也许能让你更快

checker = ObjectPermissionChecker(request.user)

videos = Video.objects.all()

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

对于您的问题,您可以使用查找有关如何使用的更多详细信息。

如果您想大幅提高速度,为什么不让数据库仅提取您感兴趣的对象

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

这将获得用户有权通过其用户和组访问的所有用户对象。

几天前,使用名为“获取用户对象”的新快捷方式功能进行了更新。如果您使用的是较旧版本的guardian,并且无法更新,您只需从那里复制代码即可

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不会包含用户组有权限的对象。如果需要,您还可以指定代码名列表,而不是单一权限

这太完美了。非常感谢。我可以用easy_install django guardian进行更新吗?别担心,我使用了pip install——升级,它似乎工作得很好……并返回一个查询集。好极了!谢谢您可以只传递Video而不是Video.objects.all,这样django就可以少做一次查询。此外,“查看视频”必须类似于“app\u name.view\u video”