1.F查询
F 可以获取对象中的字段的属性(列),并对其进行操作;
- (1) 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: 书六>]>
- (2) 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)
- (3) Concat连接操作
# 例如给title字段内容后面加上——"(第)"
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F("title"),Value("("),Value("第"),Value(")")))
2.Q查询
Q()可以使orm的fifter()方法支持, 多个查询条件,使用逻辑关系(&、|、~)包含、组合到一起进行多条件查询;
语法:
fifter(Q(查询条件1)| Q(查询条件2))
fifter(Q(查询条件2)& Q(查询条件3))
fifter(Q(查询条件4)& ~Q(查询条件5))
fifter(Q(查询条件6)| Q(Q(查询条件4)& ~ Q(Q(查询条件5)& Q(查询条件3)))
filter() 等方法中的关键字参数查询都是一起进行“AND” 的。
- (1) 如果需要执行更复杂的查询(例如OR语句),可以使用Q对象
查询作者名是小一或小二的
models.Author.objects.filter(Q(name="小一") | Q(name="小二"))
<QuerySet [<Author: 小一>, <Author: 小二>]>
- (2) 可以组合 & 和 | 操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用 ~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询
查询作者名字是小仙女并且不是2018年出版的书的书名。
models.Book.objects.filter(Q(author__name="小一") & ~Q(publish_day__year=2018)).values_list("title")
<QuerySet [('书一',)]>
- (3) 查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将”AND”在一起。Q查询条件和非Q查询条件混合使用注意,不包含Q()的查询条件一点要放在Q(查询条件)后面。
例1:
例2:
models.Book.objects.filter(Q(publish_day__year=2018) | Q(publish_day__year=2017), title__icontains="书")
<QuerySet [<Book: 书一>, <Book: 书二>, <Book: 书三(第)>, <Book: 书四(第)>, <Book: 书五(第)>, <Book: 书六(第)>]>