我正在使用Django Guardian来使用实例权限。它工作得很好,但我有一个关于过滤的问题。
假设我们有一个名为FakeItem的模型。假设我们只想过滤具有特定权限的项目的FakeItems列表。
@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)次迭代才能清除它。
我需要一些东西来直接清除原始过滤器中的列表,以优化查询。
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等。
发布于 2020-04-14 18:42:53
我建议通过以下方式实现。
使用get_objects_for_user创建一个QuerySet对象。它构建了一个查询集,并为给定用户添加了权限和所有筛选器。然后只需过滤您需要的其他值。如下例所示:
# returns the queryset filtered by permission and user
queryset = get_objects_for_user(user_object, permission_name)
return queryset.filter(name__icontains = "foo")https://stackoverflow.com/questions/61205661
复制相似问题