【发布时间】:2015-08-05 17:50:34
【问题描述】:
所以这就是场景:
class Person(models.Model):
...
class Aktion(models.Model):
...
class Aktionsteilnahme(models.Model):
person = models.ForeignKey(Person)
aktion = models.ForeignKey(Aktion)
现在的问题是,我正在基于Q()-objects 动态构建相当复杂的查询。他们最终是这样的:
Person.objects.filter(
Q((Q()|Q(aktionsteilnahme__aktion=302))&
(Q()|Q(aktionsteilnahme__aktion=547)))
)
可以(并且会自动)简化为:
Person.objects.filter(
Q(aktionsteilnahme__aktion=302)&
Q(aktionsteilnahme__aktion=547)
)
现在的问题是,这会导致这样的 SQL:
SELECT * FROM person
LEFT OUTER JOIN aktionsteilnahme ON ( person.id = aktionsteilnahme.person_id )
WHERE (aktionsteilnahme.aktion = 2890 AND aktionsteilnahme.aktion = 5924)
然而我真正需要的是:
Person.objects.filter(Q(aktionsteilnahme__aktion=302))
.filter(Q(aktionsteilnahme__aktion=547))
导致我真正需要的东西:
SELECT * FROM person
INNER JOIN aktionsteilnahme ON ( person.id = aktionsteilnahme.person_id )
INNER JOIN aktionsteilnahme T4 ON ( person.id = T4.person_id )
WHERE (aktionsteilnahme.aktion = 302 AND T4.aktion = 547)
我不能使用建议的解决方案,因为所有这些都将再次被OR'ed。
我必须能够做类似的事情:
Person.objects.filter(
Q(
Q(aktionsteilnahme__aktion=302))
.filter(Q(aktionsteilnahme__aktion=547))
)
|
Q(other_q_filters)
)
【问题讨论】:
标签: django django-queryset django-q