Подтвердить что ты не робот

Django исключает конкретные экземпляры из набора запросов без использования полевого поиска

Иногда мне нужно убедиться, что некоторые экземпляры исключены из набора запросов.
Так я обычно делаю это:

unwanted_instance = MyModel.objects.get(pk=bad_luck_number)
uninteresting_stuff_happens()
my_results = MyModel.objects.exclude(id=unwanted_instance.id)

или, если у меня их больше:

my_results = MyModel.objects.exclude(id_in=[uw_in1.id, uw_in2.id, uw_in3.id])

Это "чувствует" немного неуклюже, поэтому я попробовал:

my_ideally_obtained_results = MyModel.objects.exclude(unwanted_instance)

Что не работает. Но я прочитал здесь на SO, что подзапрос может использоваться как параметр для исключения.
Мне повезло? Я упускаю некоторые функции (проверял документы, но не нашел полезного указателя)

4b9b3361

Ответ 1

Как вы это делаете, это лучший способ.

Если это модель-агностик, который вы ищете, не забывайте, что вы можете сделать query.exclude(pk=instance.pk).

Так же, как и в стороне, если Django ORM имел идентификатор (который в настоящее время не существует), тогда вы сможете сделать что-то вроде MyModel.objects.filter(<query>).all().remove(<instance>), но вам не повезло в этом отношении. То, как вы это делаете (или то, что выше), самое лучшее, что у вас есть.

О, а также вы можете сделать гораздо лучше, чем этот запрос in со списком: query.exclude(id__in=[o.id for o in <unwanted objects>])

Ответ 2

Данный ответ прекрасен и попробуйте это, что отлично работает для меня

шаг 1)

 from django.db.models import Q

шаг 2)

 MyModel.objects.filter(~Q(id__in=[o.id for o in <unwanted objects>]))