首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Guardian -过滤时检查权限

Django Guardian -过滤时检查权限
EN

Stack Overflow用户
提问于 2020-04-14 18:34:22
回答 1查看 148关注 0票数 0

我正在使用Django Guardian来使用实例权限。它工作得很好,但我有一个关于过滤的问题。

假设我们有一个名为FakeItem的模型。假设我们只想过滤具有特定权限的项目的FakeItems列表。

代码语言:javascript
复制
@staticmethod
def purge_list(entity_list , userOrUsername, permission_name):
    requesting_user = userOrUsername
    if not isinstance(userOrUsername, User):
        requesting_user = User.objects.get(username = username)

    acl_listed = []
    total_rows = 0
    for entity in entity_list:
        if requesting_user.has_perm(entity, permission_name):
            acl_listed.append(entity)
            total_rows = total_rows + 1

    return { "list" :  acl_listed , "totals" : total_rows }

这是一个从用户可以访问的项目中清除列表的方法示例。

不幸的是,这个方法是在我用上一个过滤器从数据库中获得总列表之后调用的。我需要对列表进行O(n)次迭代才能清除它。

我需要一些东西来直接清除原始过滤器中的列表,以优化查询。

代码语言:javascript
复制
search_filter = Q()
search_filter = search_filter & Q(name__icontains = "foo")
search_filter = search_filter & Q(some_guardian_filter)
already_purged_list = FakeItem.objects.filter(search_filter)

卫报的文档只解释了如何使用单一的方法,如has_perm等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-14 18:42:53

我建议通过以下方式实现。

使用get_objects_for_user创建一个QuerySet对象。它构建了一个查询集,并为给定用户添加了权限和所有筛选器。然后只需过滤您需要的其他值。如下例所示:

代码语言:javascript
复制
# returns the queryset filtered by permission and user
queryset = get_objects_for_user(user_object, permission_name)
return queryset.filter(name__icontains = "foo")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61205661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档