Django中的F 表达式和Q对象

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对象,再写其他字段

猜你喜欢

转载自blog.csdn.net/lxb_wyf/article/details/109739209