Django从查询集中排除特定实例而不使用字段查找

时间:2010-06-13 11:46:50

标签: django filtering django-queryset

我有时需要确保从查询集中排除某些实例 这就是我经常这样做的方式:

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)

哪个不起作用。但我读了here on SO,子查询可以用作排除的参数 我运气不好吗?我错过了一些功能(检查了文档,但没有找到任何有用的指针)

4 个答案:

答案 0 :(得分:69)

你已经采取的方式是最好的方法。

如果这是一种与模特无关的方法,你正在寻找,不要忘记你可以做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>])

答案 1 :(得分:5)

给出的答案是完美的,试试这个对我来说很好

步骤1)

 from django.db.models import Q

第2步)

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

答案 2 :(得分:1)

您可以将不需要的项目放在列表中,然后像这样提取列表中的所有项目:

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

答案 3 :(得分:0)

您可以在Q查找中使用“〜”

例如,以下查询将从票据模型中获取所有票据,但标记为“已解决”状态的TKT_STATUS字段除外:

from django.db.models import Q

queryset_list = ticket.objects.filter(~Q(TKT_STATUS__iexact="solved"))