A Django ORM query using a mix of filter() and Q objects

Bartek picture Bartek · Jul 22, 2009 · Viewed 9.4k times · Source

I'm looking to create a slightly more complex query that is written fairly easily using raw SQL. Here's an example of the query in raw:

SELECT my,fields FROM sales WHERE is_paid = False OR status = 'toship' AND otherfield = 'FOO' AND anotherfield = 'BAR'

This is simple, it generates all the results that are is_paid = False and then a second result set for my AND matches.

Now I know about Q objects, I know about filtering but I can't seem to wrap my mind around how to achieve this in the Django ORM cleanly.

Any tips?

Thanks

Answer

tarequeh picture tarequeh · Jul 23, 2009

You can keep building your Q object in a somewhat dynamic fashion.

Example:

query1 = Q(is_paid=False)

query2 = Q()

if status:
    query2 = Q(status=status)

if otherfield:
    query2 = query2 & Q(otherfield=otherfield)

if anotherfield:
    query2 = query2 & Q(anotherfield=anotherfield)

query = query1 | query2

result = model.objects.filter(query)