简单理解 Django Q 对象

一般在 Django 程序中查询数据库操作都是在 QuerySet 里进行,例如下面代码:

>>> q1 = Entry.objects.filter(title__startswith = "What")
>>> q2 = q1.exclude(pub_date__gte = datetime.date.today())
>>> q3 = q1.filter(pub_date__gte = datetime.date.today())

或者将其组合起来,例如:

>>> q1 = Entry.objects.filter(title_startswith = "What").exclude(pub_date_gte = datetime.date.today())

随着程序越来越复杂,查询条件也跟着复杂起来。

Q 对象就是为了将查询条件组合起来

如果在查询的时候需要组合条件,可以使用 Q 查询对象:

from django.db.models import Q
q = Q(question_startswith = "What")

这样就生成了一个 Q 对象,可以使用符号 & 或者 | 将多个 Q 对象组合起来传递给 filter(),exclude(),get() 等函数。当多个 Q 对象组合起来时,Django 会自动生成一个新的 Q 对象。例如下面的代码就将两个条件组合成了一个:

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

上述代码可以使用 SQL 语句这么理解:

WHERE question LIKE 'Who%' OR question LIKE 'What%'

还可以在 Q 对象的前面使用 ~ 来代表“非”:

Q(question__startswith = 'Who') | ~Q(pub_date__year = 2005)

对应 SQL 语句可以理解为:

WHERE question like "Who%" OR year(pub_date) != 2005

如此便可以使用 & 或者 | 还有 () 来对条件进行分组从而组合成更加复杂的查询逻辑。

也可以传递多个 Q 对象给查询函数:

News.objects.get(
    Q(question__startswith = 'Who'),
    Q(pub_date = datetime.date(2005, 5, 2)) | Q(pub_date = datetime.date(2005, 5, 6))
)

多个 Q 对象之间的关系 Django 会自动理解成“且(and)”关系。上面代码对应的 SQL 语句可以理解为:

SELECT * from news WHERE question LIKE 'Who%'  AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

你可能感兴趣的:(简单理解 Django Q 对象)