ADDing Django's Q() objects and get two exclusive JOIN ONs <p>So this is the scenario:</p> <pre><code>class Person(models.Model): ... class Aktion(models.Model): ... class Aktionsteilnahme(models.Model): person = models.ForeignKey(Person) aktion = models.ForeignKey(Aktion) </code></pre> <p>The problem now is, that I'm dynamically constructing rather complex queries based on <code>Q()</code>-objects. They end up like this:</p> <pre><code>Person.objects.filter( Q((Q()|Q(aktionsteilnahme__aktion=302))&amp; (Q()|Q(aktionsteilnahme__aktion=547))) ) </code></pre> <p>which can (and automatically will) be reduced to:</p> <pre><code>Person.objects.filter( Q(aktionsteilnahme__aktion=302)&amp; Q(aktionsteilnahme__aktion=547) ) </code></pre> <p>The <strong>problem</strong> now is, that this results in a SQL like this:</p> <pre class="lang-sql prettyprint-override"><code>SELECT * FROM person LEFT OUTER JOIN aktionsteilnahme ON ( person.id = aktionsteilnahme.person_id ) WHERE (aktionsteilnahme.aktion = 2890 AND aktionsteilnahme.aktion = 5924) </code></pre> <p>What I would actually need however is:</p> <pre><code>Person.objects.filter(Q(aktionsteilnahme__aktion=302)) .filter(Q(aktionsteilnahme__aktion=547)) </code></pre> <p>resulting in what I would actually need:</p> <pre class="lang-sql prettyprint-override"><code>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) </code></pre> <p>I can't use the proposed solution though because all of it is gonna be <code>OR</code>'ed again.</p> <p>I would have to be able to do something like:</p> <pre><code>Person.objects.filter( Q( Q(aktionsteilnahme__aktion=302)) .filter(Q(aktionsteilnahme__aktion=547)) ) | Q(other_q_filters) ) </code></pre>