Django queryset not returning the same values as the generated sql
- by HRCerqueira
Hello guys, I have the following queryset:
subscribers = User.objects.values('email', 'username').filter( 
        Q(subscription_settings__new_question='i') | 
        Q(subscription_settings__new_question_watched_tags='i', 
          marked_tags__id__in=question.tags.values('id'), 
          tag_selections__reason='good') 
).exclude(id=question.author.id) 
The problem is that when I evaluate the query I get only the values 
that are filtered by the first Q object (even if I reverse the order 
of the objects). So lets say that I was expecting the user A, B, C and 
D, where A and B are filtered by the first Q object and C and D by the 
second. But the queryset only returns A and B. 
I used the django debug toolbar to see the query that was actually 
being executed (and then I used a direct print statement like "print 
subscriber.query.as_sql()" just to be sure) and then evaluated the 
query directly using psql (I'm using postgres by the way), and I get 
the results I expect. 
Here's the query btw: 
SELECT "auth_user"."email", "auth_user"."username" FROM "auth_user" 
LEFT OUTER JOIN "forum_markedtag" ON ("auth_user"."id" = 
"forum_markedtag"."user_id") INNER JOIN 
"forum_defaultsubscriptionsetting" ON ("auth_user"."id" = 
"forum_defaultsubscriptionsetting"."user_id") WHERE 
((("forum_markedtag"."reason" = E'good' AND 
"forum_defaultsubscriptionsetting"."new_question_watched_tags" = E'i' 
AND "forum_markedtag"."tag_id" IN (SELECT U0."id" FROM "tag" U0 INNER 
JOIN "question_tags" U1 ON (U0."id" = U1."tag_id") WHERE 
U1."question_id" = 64 )) OR 
"forum_defaultsubscriptionsetting"."new_question" = E'i' ) AND NOT 
("auth_user"."id" = 10 )) 
Thanks in advance
EDIT:
I tried to break the queryset into two, one that uses the first Q object as the filter and another one with the second Q object, and although the second queryset produces the correct sql that returns the correct values when evaluated directly, it still doesn't return nothing when evaluated as a django queryset.
heres the alternative code:
subscribers = User.objects.values('email', 'username').filter(
        subscription_settings__new_question='i').exclude(id=question.author.id)
subscribers2 = User.objects.values('email', 'username').filter(
        subscription_settings__new_question_watched_tags='i',
        marked_tags__id__in=question.tags.values('id'),
        tag_selections__reason='good').exclude(id=question.author.id)