神刀安全网

Querying with Django Q objects

Django Q objects:

Q object encapsulates a SQL expression in a Python object that can be used in database-related operations. Using Q objects we can make complex queries with less and simple code.

For example, this Q object filters whether the question starts wiht ‘what’:

from django.db.models import QQ(question__startswith=’What’)

Q objects are helpfull for complex queries because they can be combined using logical operators and(&), or(|), negation(~)

For example, this statement returns if the question starts with ‘who’ or with ‘what’.

Q(question__startswith=’Who’) | Q(question__startswith=’What’)

Note:

If the operator is not included then by default ‘AND’ operator is used

The following code is source of Q class:

class Q(tree.Node):

AND = ‘AND’

OR = ‘OR’

default = AND

def __init__(self, *args, **kwargs):super(Q, self).__init__(children=list(args) + list(six.iteritems(kwargs)))

def _combine(self, other, conn):

if not isinstance(other, Q):

raise TypeError(other)

obj = type(self)()

obj.connector = conn

obj.add(self, conn)

obj.add(other, conn)

return obj

def __or__(self, other):return self._combine(other, self.OR)

def __and__(self, other):return self._combine(other, self.AND)

def __invert__(self):

obj = type(self)()

obj.add(self, self.AND)

obj.negate()

return obj

As you can interpret from above code, we have three operators ‘or’, ‘and’ and invert(negation) and the default operator is AND.

Dynamic quering with Q objects:

This is interesting feature as we can use the operator module to create dynamic queries.

import operator

from 

django.db.models import Q

q_list = [Q(question__startswith=’Who’), Q(question__startswith=’What’)]

your_model_object.objects.filter(reduce(operator.or_, q_list))

We are performing the or operation using operator.or_

To use and operations simply execute:

your_model_object.objects.filter(reduce(operator.and_, q_list))

Q objects not only simplify complex queries, they are very handy for dynamic filtering.

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Querying with Django Q objects

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址