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

时间:2013-06-06 16:01:28

标签: django django-models django-q

假设我有以下Django模型:

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


class myClass2(models.Model):
    myLocalClass1 = models.ManyToManyField(myClass1)     

此外,假设我有一个唯一的myClass1s列表:

a = myClass1(myField=1)
b = myClass1(myField=2)
c = myClass1(myField=3)
myTargetList = [a, b, c]

现在,我想使用Q对象编写一个Django查询,以便它将myTargetList的任何成员的所有myClass2都返回为myLocalClass1。此外,我事先并不知道myTargetList的确切大小。

我该怎么办?这显然不起作用:

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

2 个答案:

答案 0 :(得分:1)

你几乎拥有它,你不需要Q个对象,你可以只使用invalues_list的组合:

l = myClass1.objects.filter(myField__in=[1, 2, 3]).values_list("id", flat=True)
myClass2.objects.filter(myLocalClass1__pk__in=l) 

答案 1 :(得分:1)

你可以这样做:

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()