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

django, django-q, orm

Solution

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)

Problem

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

Original source