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

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -