Я использую Django Хранитель, чтобы использовать разрешения экземпляра. Это хорошо работает, но у меня есть вопрос о фильтрации.
Допустим, у нас есть модели с именем FakeItem. Допустим, мы хотим отфильтровать список FakeItems только с элементом с указанным разрешением c.
@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)
Guardian's Документация только объясняет, как использовать один метод, такой как has_perm et c ...