Django中的F 表达式和Q对象
F
from django.db.models import F
Django中提供F 表达式, 就是将模型字段的值与同一模型中的另一个字段进行比较
例如,查询阅读量大于等于评论量的图书:
from django.db.models import F
BookInfo.objects.filter(bread__gte=F('bcomment'))
Django 支持对 F()
对象使用常量和其他 F()
对象的加法,减法,乘法,除法,模和幂运算。
例如: 查询阅读量大于2倍评论量的图书
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
要查找 entry
评级小于 pingback
计数和评论计数总和的所有条目,我们将发出查询:
Entry.objects.filter(rating__lt=F('n_comments') + F('n_pingbacks'))
您还可以使用双下划线表示法来跨越 F()
对象中的关系。具有双下划线的 F()
对象将引入访问相关对象所需的任何连接。例如,要检索作者姓名与博客名称相同的所有条目,我们可以发出查询:
Entry.objects.filter(authors__name=F('blog__name'))
对于 date 和 date/time 字段,可以添加或减去 timedelta
对象。以下内容将返回发布后超过 3 天修改的所有 entry
:
from datetime import timedelta
Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))
F()
对象支持 .bitand()
,.bitor()
,.bitrightshift()
和 .bitleftshift()
的按位运算。例如:
>>> F('somefield').bitand(16)
修改操作(update)也可以使用 F() 函数。
例: 将每一本书的价格提高100元
Book.objects.update(price=F("price") + 100)
Q
from django.db.models import Q
Q对象就相当与查询时使用or
语句的查询,或者的意思
Q对象可以使用&
和|
进行组合运算, 当一个操作符用于两个Q对象时,它就会生成一个新的Q对象
例如,这个语句产生一个 Q
对象,它表示两个 "question__startswith"
查询的 "OR"
:(__startswith
为模糊查询)
Q(question__startswith='Who') | Q(question__startswith='What')
这相当于以下 SQL WHERE 子句:
WHERE question LIKE 'Who%' OR question LIKE 'What%'
查找函数可以混合使用 Q
对象和关键字参数。提供给查找函数的所有参数(不管它们是关键字参数还是 Q
对象)都是 “AND
” 一起编辑的。如果提供了一个 Q
对象,它必须在任何关键字参数的定义之前
例如:
Poll.objects.get( Q(pub_date=date(2005, 5, 2))|Q(pub_date=date(2005, 5, 6)),
question__startswith='Who', )
就是在混合使用的时候先写Q对象,再写其他字段