When Django's ORM Uses Q? -
i trying use django's q functionality generate , and or sql queries, unfortunately can't seem figure out how , when django generates it's conditionals. had more complex query decided pare down see going on.
example without q():
>>> myobject.objects.filter(status='value').count() 6
and q():
>>> myobject.objects.filter(q(status='value')).count() 22
and queries generates django.db.connection:
[{'time': '0.001', 'sql': 'select count(*) "myobjects_myobject" "myobjects_myobject"."status" = e\'value\' '}, {'time': '0.001', 'sql': 'select count(*) "myobjects_myobject"'}]
and add value:
>>> myobject.objects.filter(q(status='value'), q(created_date__lt=a_date_value)).count() 22
but when reverse order get:
>>> myobject.objects.filter(q(created_date__lt=a_date_value), q(status='value'), ).count() 6
with sql:
[{'time': '0.001', 'sql': 'select count(*) "myobjects_myobject" "myobjects_myobject"."created_date" < e\'2011-02-09 00:24:55.927825\' '}, {'time': '0.001', 'sql': 'select count(*) "myobjects_myobject" "myobjects_myobject"."status" = e\'value\' '}
so looks me it's ignoring first q value each time - expected behavior?
if actual code you've executed you've stumbled upon bug in django.
the following should have identical results:
>>> myobject.objects.filter(status='value').count() >>> myobject.objects.filter(q(status='value')).count()
it doesn't matter though, q
objects never needed.
instead of this:
>>> qs = myobject.objects.all() >>> qs.filter(q(status='value') | q(status='unknown')).count()
you can use this:
>>> qs = myobject.objects.all() >>> (qs.filter(status='value') | qs.filter(status='unknown')).count()
Comments
Post a Comment