Django ORMF和Q查询

F查询

在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

查询书id大于\小于价格的书籍

models.Book.objects.filter(id__gt=F("price"))
<QuerySet []>

models.Book.objects.filter(id__lt=F("price")) <QuerySet [<Book: 书一>, <Book: 书二>, <Book: 书三>, <Book: 书四>, <Book: 书五>, <Book: 书六>]>

Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。 
这里写图片描述

models.Book.objects.filter(id__lt=F("price")/2)
<QuerySet [<Book: 书一>, <Book: 书二>, <Book: 书三>, <Book: 书四>, <Book: 书五>]>

修改操作也可以使用F函数,比如将每一本书的价格提高30元

models.Book.objects.all().update(price=F("price")+30)

修改之后的截图如下: 
这里写图片描述

Concat链接

from django.db.models.functions import Concat
from django.db.models import Value models.Book.objects.update(title=Concat(F("title"),Value("("),Value("第"),Value(")")))

修改之后的表如下: 
这里写图片描述

Q查询

filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象

查询作者名是小仙女或小魔女的

models.Author.objects.filter(Q(name="小一") | Q(name="小三")) <QuerySet [<Author: 小一>, <Author: 小三>]> 

你可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询

查询作者名字是小仙女并且不是2018年出版的书的书名。

models.Book.objects.filter(Q(author__name="小一") & ~Q(publish_day__year=2018)).values_list("title")
<QuerySet [('书一',)]>

查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将”AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面

models.Book.objects.filter(Q(publish_day__year=2018) | Q(publish_day__year=2017), title__icontains="书")
<QuerySet [<Book: 书一>, <Book: 书二>, <Book: 书三(第)>, <Book: 书四(第)>, <Book: 书五(第)>, <Book: 书六(第)>]> 

猜你喜欢

转载自www.cnblogs.com/hyhyhy/p/9449741.html