博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORM之F查询和Q查询
阅读量:4949 次
发布时间:2019-06-11

本文共 1960 字,大约阅读时间需要 6 分钟。

F查询和Q查询

1. 当需要字段和字段作比较的时候用F查询

2. 当查询条件是 或 的时候 用Q查询,因为默认的filter参数都是且的关系

F查询

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

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

示例1:

查询评论数大于收藏数的书籍

from django.db.models import Fmodels.Book.objects.filter(commnet_num__gt=F('keep_num'))

Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。

models.Book.objects.filter(commnet_num__lt=F('keep_num')*2)

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

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

 引申

如果要修改char字段咋办?

如:把所有书名后面加上(第一版)

>>> from django.db.models.functions import Concat>>> from django.db.models import Value>>> models.Book.objects.all().update(title=Concat(F("title"), Value("("), Value("第一版"), Value(")")))# SQL分析:models.Book.objects.all().update(title)   #  更新title字段title=Concat(F("title"), Value("("), Value("第一版"), Value(")")) # 1.Concat把字符串F('title') 和 Value(表示转换成值)'第一版' 拼接起来

Q查询

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

示例1:

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

models.Book.objects.filter(Q(authors__name="小仙女")|Q(authors__name="小魔女"))

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

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

>>> models.Book.objects.filter(Q(author__name="小仙女") & ~Q(publish_date__year=2018)).values_list("title")

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

例如:查询出版年份是2017或2018,书名中带物语的所有书。

>>> models.Book.objects.filter(Q(publish_date__year=2018) | Q(publish_date__year=2017), title__icontains="物语")
,
,
]>

Q查询输入字符串

Book.objects.filter(Q(title="linux") | Q(price=123))

上面的方式查询条件只能是字段名。

如果我们只有字符串怎么写呢?  “title” “price”

 

q = Q()                                # 实例化一个Q对象q.connector = "or"                     # 默认是且的关系q.children.append("title", "linux")    q.children.append("price", 123)Book.objects.filter(q)                 # 这个效果和上面的一样,只是条件可以是字符串了

 

转载于:https://www.cnblogs.com/lxfpy/p/10890296.html

你可能感兴趣的文章
c#线程学习笔记一---基本概念
查看>>
约瑟夫问题
查看>>
如何聘用优秀的性能测试工程师?
查看>>
Python爬虫开发【第1篇】【Json与JsonPath】
查看>>
2018-4-13
查看>>
两台电脑间的消息传输
查看>>
Linux 标准 I/O 库
查看>>
Spring Data JPA教程, 第八部分:Adding Functionality to a Repository (未翻译)
查看>>
ajax跨域请求,状态码200,F12控制台报错
查看>>
MINIGUI 编译 helloworld
查看>>
SpringMvc架构流程
查看>>
Oracle中如何一次插入多条数据
查看>>
转发JavaScript Object Notation
查看>>
专业实训题目需求分析
查看>>
《福布斯》:IT人最痛苦!?
查看>>
深入理解linux i节点(inode)
查看>>
C# 反射之属性操作
查看>>
对于研发组长的责任产生了疑惑。
查看>>
使用JS如何消除一个数组里重复的元素
查看>>
JDBC查询不到数据
查看>>