Django在不使用字段查找的情况下从queryset中排除特定实例

Django在不使用字段查找的情况下从queryset中排除特定实例,django,filtering,django-queryset,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, u

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

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)
这不管用。但我了解到子查询可以用作排除的参数。

我运气不好吗?我是否缺少一些功能(查看了文档,但没有找到任何有用的指针)

您已经使用的方法是最好的方法

如果您正在寻找一种与模型无关的方法,请不要忘记您可以执行
query.exclude(pk=instance.pk)

顺便说一句,如果Django的ORM有一个身份映射器(目前还没有),那么您就可以执行类似于MyModel.objects.filter().all().remove()之类的操作,但在这方面您运气不好。你做这件事的方式(或上面的方式)是你最好的方式


哦,而且你还可以通过列表理解在查询中做得更好:
query.exclude(id_uuin=[o.id for o in])
给出的答案很完美,试试这个对我来说很好

步骤1)

步骤2)

MyModel.objects.filter(~Q(id\uu-in=[o.id for o-in]))

您可以将不需要的项目放在列表中,并获取除列表中的项目以外的所有项目,如下所示:

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

此外,如果您有要排除的查询集(例如
MyModel.objects.filter()
),则可以使用
ValuesQuerySet
获取id,如:
id\u dicts=MyModel.objects.filter().values('id')
,然后
query.exclude(id\u in=[item['id']for item in id\u dicts])
。我只是想在@racingtapole的建议中添加一些内容:您可以轻松地使用
值列表(“id”,flat=True)
获得所有id的顺序列表。但是,这会影响数据库,因此我建议使用Python的列表理解。如何使用
Q
表达式比
.exclude(id_uuin=[o.id代表o in])更好
?这是另一种实现同样效果的替代方案,似乎效率很低。这在
blocks=self.blocks.filter(~Q(image='')| Q(~Q(video='')&Q(loop=True)))这样的场景中效果很好。
这是我在问题中明确指出的一个尝试。我在寻找替代方案!
 MyModel.objects.filter(~Q(id__in=[o.id for o in <unwanted objects>]))
MyModel.objects.exclude(id__in=[id1,id2,id3 ])