Множество исключений Django()
Есть ли способ сделать запрос и исключить список вещей, а не вызывать исключение несколько раз?
Ответы
Ответ 1
На основе вашего ответа на Ned это звучит так, будто вы просто хотите исключить список тегов. Поэтому вы можете просто использовать фильтр in
:
names_to_exclude = [o.name for o in objects_to_exclude]
Foo.objects.exclude(name__in=names_to_exclude)
Это делает то, что вы хотите?
Ответ 2
Вы можете сделать это довольно легко с объект Q:
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)
Вы также можете сделать это динамически с помощью exclude():
qs = Foo.objects.all()
for tag in ignored_tags:
qs = qs.exclude(tag=tag)
Ответ 3
Что неправильно с вызовом exclude несколько раз? Запросы ленивы, ничего не происходит, пока вы не попытаетесь извлечь данные из него, поэтому нет недостатка в использовании .exclude() более одного раза.
Ответ 4
Чтобы улучшить ответ Даниэля Роземана, я думаю, что было бы лучше получить нужные вам значения непосредственно из набора запросов вместо цикла for, который может быть дорогостоящим на больших наборах данных. i.e.
names_to_exclude = objects_to_exclude.values_list('name')
Foo.objects.exclude(name__in=names_to_exclude)
Ответ 5
Вы также можете попробовать это.
exclude_list = ['A', 'B', 'C']
qs = Foo.objects.exclude(items__in=exclude_list)