Django исключает конкретные экземпляры из набора запросов без использования поиска по полю - PullRequest
33 голосов
/ 13 июня 2010

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

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

Ответы [ 3 ]

69 голосов
/ 13 июня 2010

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

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

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

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

5 голосов
/ 26 октября 2012

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

шаг 1)

 from django.db.models import Q

шаг 2)

 MyModel.objects.filter(~Q(id__in=[o.id for o in <unwanted objects>]))
1 голос
/ 11 июля 2018

Вы можете поместить свои нежелательные элементы в список и получить все элементы, кроме перечисленных в списке, например:

MyModel.objects.exclude(id__in=[id1,id2,id3 ])
...