假设我有以下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))
答案 0 :(得分:1)
你几乎拥有它,你不需要Q
个对象,你可以只使用in
和values_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()