Django 如何使用Q对象检查任意长度列表的任何成员是否处于多对多关系中?

Django 如何使用Q对象检查任意长度列表的任何成员是否处于多对多关系中?,django,django-models,django-q,Django,Django Models,Django Q,假设我有以下Django模型: class myClass1(models.Model): myField1 = models.IntegerField() class myClass2(models.Model): myLocalClass1 = models.ManyToManyField(myClass1) 此外,假设我有一个唯一MyClassas的列表: a = myClass1(myField=1) b = myClass1(myField=2

假设我有以下Django模型:

class myClass1(models.Model):
    myField1 = models.IntegerField()     


class myClass2(models.Model):
    myLocalClass1 = models.ManyToManyField(myClass1)     
此外,假设我有一个唯一MyClassas的列表:

a = myClass1(myField=1)
b = myClass1(myField=2)
c = myClass1(myField=3)
myTargetList = [a, b, c]
现在,我想使用Q对象编写一个Django查询,以便它返回所有MyClass2,其中myTargetList的任何成员都是myLocalClass1。此外,我事先不知道myTargetList的确切大小

我该怎么做?这显然行不通:

myClass2.objects.filter(Q(myLocalClass1__in=myTargetList))

您几乎拥有它,您不需要
Q
对象,您只需使用和的组合:

您可以这样做:

myclass1_qs = myClass1.objects.filter(myField__in=[1, 2, 3])
myclass2_qs = myClass2.objects.filter(myLocalClass1__in=myclass1_qs).distinct()
或者这是一条单行线

myclass2_qs = myClass2.objects.filter(myLocalClass1__myField__in=[1, 2, 3]).distinct() 

不,我认为这是不对的。在本例中,您的列表l将是myTargetList中所有MyClassas的ID列表。所以在这些ID上过滤myClass2是没有意义的。我们如何将myClass1 ID列表转换为myClass2 ID的正确列表?是否要获取列表中至少包含一个myClass1对象的所有
myClass2
对象?是的。但我不相信你的解决方案是这样的。您的解决方案将获得我感兴趣的myClass1的ID列表。然后它会查找与这些ID匹配的MyClass2。这是不对的(除非我真的错过了一些非常重要的东西。但我不认为我错过了)啊,好吧,抱歉,这是一个输入错误,应该是myLocalClass1\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。使用pks进行搜索的原因是,您不必联接表(尽管orm在内部也会这样做)
myClass2.objects.filter(myLocalClass1\uu in=myTargetList)
将起作用(假设这些表有ID并保存到数据库中)。如果不是这个,你的问题是什么?您正在寻找与myTargetList中的项目完全相同的myClass2对象吗?这非常优雅。。。。而且它几乎可以工作。问题是myclass2_qs现在包含所有符合条件的myclass2。但是,对于链接到多个MyClass2的MyClass2,它包含重复的MyClass2。如何确保myclass2_qs不包含重复项?当然,我可以用python来实现这一点。但是,如果数据库层在将答案返回给我之前执行此操作,则效率最高。对吗?您需要在queryset中使用
.distinct()
子句。
myclass2_qs = myClass2.objects.filter(myLocalClass1__myField__in=[1, 2, 3]).distinct()