我有时需要确保从查询集中排除某些实例 这就是我经常这样做的方式:
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,子查询可以用作排除的参数 我运气不好吗?我错过了一些功能(检查了文档,但没有找到任何有用的指针)
答案 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"))