Множество исключений 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)