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, что подзапрос может использоваться как параметр для исключения.
Мне повезло? Я упускаю некоторые функции (проверял документы, но не нашел полезного указателя)
Ответы
Ответ 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>]))