Есть ли способ сделать запрос и исключить список вещей, а не вызывать исключение несколько раз?Django object multiple exclude()
ответ
Основываясь на вашем ответе на Неда, он похоже, что вы просто хотите исключить список тегов. Таким образом, вы могли бы просто использовать in
фильтр:
names_to_exclude = [o.name for o in objects_to_exclude]
Foo.objects.exclude(name__in=names_to_exclude)
ли это делать то, что вы хотите?
Что случилось с вызовом exclude несколько раз? Запросы ленивы, ничего не происходит, пока вы не попытаетесь извлечь данные из него, поэтому нет недостатка в использовании .exclude() более одного раза.
У меня есть модель, у которой есть метки manytomany field. пользователь может иметь большое количество тегов игнорирования. Я хочу динамически исключать объекты, которые пользователь не хочет видеть. Я не буду знать, сколько раз вызывать исключение до запуска. – Johnd
Не могли бы вы объяснить, что вы подразумеваете под «запросы ленивы» и «извлекать данные из него»? Thnx – akki
Что означает ленивое средство, что данные не будут извлекаться из базы данных до тех пор, пока запрос не будет использован. –
Вы можете сделать это довольно легко с Q object:
from django.db.models import Q
excludes = None
for tag in ignored_tags:
q = Q(tag=tag)
excludes = (excludes and (excludes | q)) or q # makes sure excludes is set properly
set_minus_excluded = Foo.objects.exclude(excludes)
Вы также должны быть в состоянии сделать это динамически исключить():
qs = Foo.objects.all()
for tag in ignored_tags:
qs = qs.exclude(tag=tag)
Чтобы улучшить ответ Daniel Роземан, я думаю, что было бы лучше, чтобы получить необходимые значения непосредственно из QuerySet вместо того, чтобы за цикл, который может быть дорогим на больших наборов данных, т.е.
names_to_exclude = objects_to_exclude.values_list('name')
Foo.objects.exclude(name__in=names_to_exclude)
Вы можете попробовать это также.
exclude_list = ['A', 'B', 'C'] qs = Foo.objects.exclude(items__in=exclude_list)
Я делаю это со списком objects_to_exclude напрямую, я не использую o.name: ignore_tags = request.user.ignore_tags.all() case_list = Case.objects.exclude (tags__in = ignore_tags)) – Johnd