Django ORM的F和Q查询

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: 书六()>]>
发布了146 篇原创文章 · 获赞 66 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_38923792/article/details/102383579