首页 > 其他分享 >django ORM之Q查询与F查询

django ORM之Q查询与F查询

时间:2022-11-21 17:35:32浏览次数:45  
标签:Book 对象 price django models ORM import 查询

F对象查询与Q对象查询也是 Django 提供的查询方法,而且非常的简单的高效,对于一些特殊的场景需求应用起来非常的合适,在本文中我们将对这两种查询方法进行讲解,帮助大家掌握它们的使用方法以及适合应用的场景。

1. F查询

  F对象主要用于模型类的 A 字段属性与 B 字段属性两者的比较,即操作数据库中某一列的值。通常是对数据库中的字段值在不获取的情况下进行操作。F 对象内置在数据包django.db.models中,所以使用时需要提前导入。如下所示:

 

from django.db.models import F

 

  它的语法格式如下所示:

from django.db.models import F
F('字段名')

  在使用F对象进行查询的时候需要注意:一个 F() 对象代表了一个 Model 的字段的值;F 对象可以在没有实际访问数据库获取数据值的情况下对字段的值进行引用。

  Django 支持对 F对象引用字段的算术运算操作,并且运算符两边可以是具体的数值或者是另一个 F 对象,下面我们通过实例进一步认识 F 对象。

from django.db.models import F
from index.models import Book 
#给Book所有实例价格(retail_price)涨价20元 
Book.objects.all().update(retail_price=F('retail_price')+20) #获取该列所有值并加20
#利用传统的方法实现涨价20元
books = models.Book.objects.all() 
for book in books:     
    book.update(retail_price=book.retail_price+20)     
    book.save()

  通过上述实例可以看出,使用 F 对象相对传统的方法要简单的多。那么如何通过 F 对象实现两个字段值(列)之间的比较呢?实例如下所示:

#对数据库中两个字段的值进行比较,列出哪儿些书的零售价高于定价 
books = Book.objects.filter(retail_price__gt=F('price')) 
for book in books: 
    print(book.title, '定价:', book.price, '现价:', book.retail_price)

 

2. Q对象查询

   Q 对象相比 F 对象更加复杂一点,它主要应用于包含逻辑运算的复杂查询。Q 对象把关键字参数封装在一起,并传递给 filter、exclude、get 等查询的方法。多个 Q 对象之间可以使用&或者|运算符组合(符号分别表示与和或的关系),从而产生一个新的 Q 对象。当然也可以使用~(非)运算符来取反,从而实现NOT查询。Q 对象的导入方式如下所示:

from django.db.models import Q

  Q 对象位于一个数据包里面。常用语法格式如下:

Q(条件1)|Q(条件2)  # 条件1成立或条件2成立
Q(条件1)&Q(条件2)  # 条件1和条件2同时成立
Q(条件1)&~Q(条件2)  # 条件1成立且条件2不成立
#...等

最简单的 Q 对象的使用方法是将单个字段类属性作为参数进行查询,实例如下:

#查询 书籍的title中包含有字母P的
from index.models import Book
from django.db.models import Q
res = Book.objects.filter(Q(title__contains="P"))
print(res)
------------------------------------------------- <QuerySet [<Book: Book object (1)>]>

但是 Q 对象在实际的应用中往往是较为复杂的,和常和逻辑运算符一起使用,如下所示:

#多个Q对象组合
from index.models import Book
from django.db.models import Q 
#查找pub_id=2的书或价格低于35的书  
Book.objects.filter(Q(retail_price__lt=35)|Q(pub_id=2))  #两个Q对象是或者的逻辑关系 #查找不是pub_id=2的书且价格低于45的书  
Book.objects.filter(Q(retail_price__lt=45)&~Q(pub_id=2)) #条件1成立条件2不成立

Q 对象也可以与类属性的字段名组合在一起使用,但是在这种情况下,Django 规定,Q 对象必须放在前面,示例如下:

Book.objects.filter(Q(price__lte=100),title__icontains="p")#组合使用
<QuerySet [<Book: Book object (1)>]>

 

标签:Book,对象,price,django,models,ORM,import,查询
From: https://www.cnblogs.com/fangyu-blog/p/16912055.html

相关文章

  • Spring Redis 模糊查询匹配key
    背景原方法在Redis内存储条数过多时效率较低,尝试进行改良。修改模糊查询方式后有效提高查询效率。改良步骤原方法原模糊查询方法采用ScanOptions匹配key的前缀,但并未设......
  • Oracle笔记(八)复杂查询及总结
    一、复杂查询1、列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资。1、确定所需要的数据表:emp表:可以查询出员工的数量;dept表......
  • rdb-tools查询大key
    用redis自带命令查询大keyredis-cli-h192.168.246.74-p6390--bigkeysyuminstallpython-devel#在安装python-lzf之前,要安装python-devel依赖包,否则安装会失败ln-s......
  • WPS云文档如何批量查询快递物流信息?
    如何在表格中批量查询快递物流信息?没错,就是使用Excel网络函数库的快递查询公式。具体的示例可以看下面这篇文章: https://zhuanlan.zhihu.com/p/541529548。既然本地的表......
  • sqlsugar 扩展不区分大小写查询
    一、添加扩展    ①、配置扩展方法varcontext=newSqlSugarScope(newConnectionConfig(){DbType=DbType.MySqlConnector......
  • Vue form-create的基本使用
    Vueform-create的基本使用 原文地址:https://blog.csdn.net/muguli2008/article/details/105738336/前言由于之前有个Web项目,大部分都是表单,而且这些表单是通过请求......
  • PHPStorm配置PHP调试环境,xdebug调试原理
    之前的调试环境有一点混乱,所以决定重新配置一遍,写这篇文章记录出现的问题,希望能够帮助到你们搭建环境windowsphpstudyapache/nginxphp7.3phpstormxdebug+chromephpstudy......
  • 详解谷歌浏览器 performance 选项卡
    本文要点详细介绍谷歌浏览器performance选项卡的各个指标,让你知道如何查看网页性能。谷歌浏览器版本为:79.0.3945.117(正式版本)(64位)。性能分析操作流程1.在谷歌浏览......
  • mybatis流式查询与分页插件
    1、流式查询1、实体类packagecom.wanqi.pojo;importjava.util.Date;/***@DescriptionTODO*@Version1.0.0*@Date2022/9/12*@Authorwandaren*/......
  • 篇(17)-Asp.Net Core入门实战-文章管理之文章类别管理(Linq子查询)
    篇(17)-Asp.NetCore入门实战-文章管理之文章类别的管理如果要做一个CMS系统,那么文章管理算是入门,文章管理附带一个类别管理,用来对文章进行类别区分。所以,本章简单讲一些......