一般在 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')