F与Q查询

F查询

why?

我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢

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

show time (我们来演示以下啪)⏮⏸⏭

  1. 1 from django.db import models
  2. 2
  3. 3 # Create your models here.
  4. 4
  5. 5 class Product(models.Model):
  6. 6 name=models.CharField(max_length=32)
  7. 7 price = models.DecimalField(max_digits=8, decimal_places=2)
  8. 8 sell = models.IntegerField()
  9. 9 stock = models.IntegerField()
  10. 10
  11. 11 def __str__(self):
  12. 12 return '商品对象的名字:%s' %(self.name)

  1. 1 # 将所有的商品的价格提高100块
  2. 2 models.Product.objects.update(price=F('price')+100)
  3. 3
  4. 4
  5. 5 update是批量操作,作用于每一个叫price的字段
  6. 6 注意:
  7. 7 1.将价格提高是个更新的操作
  8. 8 2.update是没有返回值的
  9. 9 3.update必须要写指定一个变量名price=...
  10. 10 4.价格提高一百,首先考虑将价格字段找出来

结论:Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。基于此可以对表中的数值类型进行数学运算

如果要修改char字段咋办(千万不能用上面对数值类型的操作!!!)?

  1. 1 # 将所有商品的名字后面都加一个爆款
  2. 2 from django.db.models.functions import Concat
  3. 3 from django.db.models import Value
  4. 4 models.Product.objects.update(name=Concat(F('name'),Value('爆款')))

结论:把所有name后面加上'爆款',(这个时候需要对字符串进行拼接Concat操作,并且要加上拼接值Value),

   Concat表示进行字符串的拼接操作,参数位置决定了拼接是在头部拼接还是尾部拼接,Value里面是要新增的拼接值

Q查询

导火线:

  1. 1 hhh=models.Product.objects.filter(price=188.88,name='连衣裙爆款')
  2. 2 print(hhh)
  3. 3
  4. 4
  5. 5 结果:
  6. 6 <QuerySet []>
  7. 7
  8. 8 结论:filer是过滤 (条件一and条件2
  9. 9
  10. 10 不成立,返回空的queryset对象
  1. 1 from django.db.models import Q
  2. 2 # and 关系
  3. 3 one = models.Product.objects.filter(Q(price=188.88),Q(name='连衣裙爆款'))
  4. 4 # or 关系
  5. 5 two = models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款'))
  6. 6 # not 关系 (价格是488.88,衣服的名字不是连衣裙爆款的条件)
  7. 7 three = models.Product.objects.filter(Q(price=488.88)|~Q(name='连衣裙爆款'))
  8. 8 print(one, two, three)

结论:如果有多个筛选条件,而filter只能是and的关系,所以可以考虑使用Q对象,| 是or 的关系,|~是not 取反的关系

注意:

Q(表中的字段='.....')

  1. 1 # 混合使用 需要注意的是Q对象必须放在普通的过滤条件前面
  2. 2 #and 名字为'高跟鞋爆款',并且价格为488.88
  3. 3 mixture1 = models.Product.objects.filter(Q(name='高跟鞋爆款'),price=488.88)
  4. 4 print(mixture1)
  5. 5 #mot取反 名字不为'高跟鞋爆款',并且价格为488.88
  6. 6 mixture2 = models.Product.objects.filter(~Q(name='高跟鞋爆款'), price=488.88)
  7. 7 print(mixture2)

混合使用

补充小知识点:

  1. 1 from django.db.models import F,Q
  2. 2 q=Q()
  3. 3 # 通过这个参数可以将Q对象默认的and关系变成or
  4. 4 q.connector = 'or'
  5. 5 q.children.append(('price',923.34))
  6. 6 #append说明是list,所以可以追加第二个元素
  7. 7 q.children.append(('name','高跟鞋爆款爆款爆款爆款爆款'))
  8. 8 lalala = models.Product.objects.filter(q) # Q对象查询默认也是and ,这里变成了or
  9. 9 print(lalala)

Q与F查询需要注意的点

  1. 1.FQ查询都是在filter ,update等中使用,
  2. 2.
  3. res = models.表名.objects.filter(字段名1__gt=F('字段名2')) 表示字段名1大于字段名2
  4. 必须是数字类型比较
  5.  
  6. res=models.表名.objects.update(字段名1=F('字段名1')+100)
  7. 数字进行相加,update遍历运算
  8.  
  9. res=models.表名.objects.update(字段名1=Concat(F('字段名1'),Value('自定义的字符串')))
  10. 字段的值必须也是字符串,字符串相加
  11.  
  12. 3.
  13. res=models.表名.objects.filter(Q(字段名1=字段对应的值为整型)|~Q(字段名2='字段对应的值为字符串类型加引号'))
  14.  
  15. res = models.表名.objects.filter(~Q(字段名1='字段值字符串类型'),字段名2=字段值为整型)
  16.  
  17. from django.db.models import F, Q
  18. q = Q()
  19. q.connector = 'or' # 通过这个参数可以将Q对象默认的and关系变成or
  20. q.children.append(('字段名1',字段值整型))
  21. q.children.append(('字段名2','字段值字符串'))
  22. res = models.表名.objects.filter(q) # Q对象查询默认也是and
  23. print(res)

事务

事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性(NoSQL数据库对于事务则是部分支持)

  1. 原子性
    一致性
    隔离性
    持久性
  1. 1 # 将卖出数 + 1, 库存数 - 1
  2. 2 from django.db import transaction
  3. 3 from django.db.models import F
  4. 4 try:
  5. 5 with transaction.atomic():
  6. 6 # 在with代码块儿写你的事务操作
  7. 7 models.Product.objects.filter(id=1).update(sell=F('sell')-1)
  8. 8 models.Product.objects.filter(id=1).update(stock=F('stock')+1)
  9. 9 # # 写其他代码逻辑
  10. 10 except Exception as e:
  11. 11 print(e)

orm字段补充

only与defer

  1. 1 aaa = models.Product.objects.values('name') #列表套字典
  2. 2 print(aaa)
  3. 3 # <QuerySet [{'name': '高跟鞋爆款'}, {'name': '连衣裙爆款'}, {'name': '帽子爆款'}]>
  4. 4 res = models.Product.objects.only('name') #only能够帮你拿到对象
  5. 5 print(res)
  6. 6 #<QuerySet [<Product: 商品对象的名字:高跟鞋爆款>, <Product: 商品对象的名字:连衣裙爆款>, <Product: 商品对象的名字:帽子爆款>]>
  7. 7 for i in res: #走了一句sql语句,对象中存在这个字段
  8. 8 print(i.name)
  9. 9 # 高跟鞋爆款
  10. 10 # 连衣裙爆款
  11. 11 # 帽子爆款
  12. 12 for i in res: #走了四句sql语句 (包括models.Product.objects.only('name')这一句) for循环三次(数据库三个name),所以是四次
  13. 13 print(i.price) #only得到的对象去点一个没有的字段,可以点但是会重新走一遍sql语句,效率低
  14. 14
  15. 15
  16. 16 defer = models.Product.objects.defer('name')
  17. 17 print(defer)
  18. 18 # < QuerySet[ < Product: 商品对象的名字:高跟鞋爆款 >, < Product: 商品对象的名字:连衣裙爆款 >, < Product: 商品对象的名字:帽子爆款 >] >
  19. 19 for i in res: #走一次sql语句,有这个字段
  20. 20 print(i.price)
  21. 21 # 888.88
  22. 22 # 2688.88
  23. 23 # 923.34
  24. 24 for i in res: #走四次sql语句 没有这个字段
  25. 25 print(i.name)
  1. onlyname查对象,里面只有name属性,defername查对象,除了name属性,其他的都有
    gender

  1. 1 gender = models.Product.objects.filter(id=1).first()
  2. 2 print(gender.gender) #展示的是数字
  3. 3 print(gender.get_gender_display()) #获取编号对应的中文注释choices = ((1,'男'),(2,'女'),(3,'其他'))
  4. 4 models.Product.objects.create(gender=1)
  5. 5
  6. 6 #传数据的时候只要存数字,查的时候就用.get_gender_display()

django之 F与Q查询的更多相关文章

  1. Django之F、Q查询,事务,自定义char字段

    F查询 from django.db.models import F,Q # 当查询条件来自于数据库的某个字段,这个时候就必须使用F # 查询卖出数大于库存数的商品 res = models.Prod ...

  2. Django之F和Q查询

    一.F查询 rom django.db.models import F from app01.models import Book Book.objects.update(price=F(" ...

  3. Django之F与Q查询

    F查询 from django.db.models import F,Q # 1.查询库存数大于卖出数的书籍 res = models.Book.objects.filter(kucun__gt=F( ...

  4. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  5. Django中多表的增删改查操作及聚合查询、F、Q查询

    一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...

  6. django基础之day05,F与Q查询,Q查询的高级用法

    #F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...

  7. django F与Q查询 事务 only与defer

    F与Q 查询 class Product(models.Model): name = models.CharField(max_length=32) #都是类实例化出来的对象 price = mode ...

  8. Django ORM 之F、Q查询与事务

    返回ORM目录 Django ORM 内容目录 一.F.Q查询 二.事务 三.only与defer 一.F.Q查询 """ Product表中的数据: 1 橡皮 2 20 ...

  9. Django 聚合查询 分组查询 F与Q查询

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

随机推荐

  1. HEXO+Git+Github+域名搭建个人博客

    搭建个人博客可以分为以下五个部分 一.搭建本地环境(个人为Win10) 1.安装Git,下载地址:点击 下载后,按提示进行安装即可,作用是:把本地的内容提交到github上去 注意:官网下载速度不是很 ...

  2. L2-013 红色警报(25 分)

    L2-013 红色警报(25 分)战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是 ...

  3. Python计算给定日期的周内的某一天

    先理一下思路:1.weekday会根据某个日期返回0到6的一个数字来表示星期几对吧,0==星期一我们来列一个表: [0,1,2,3,4,5,6] 2.知道了星期几之后,你可以计算出那一周相对于这个0到 ...

  4. 什么是x86什么是x64 它们有什么区别

    1.内存寻址不同: 32位系统,最大支持3.5G内存,如果在32位系统中使用4G或更大的内存,电脑最多只可以识别3.4G左右可用,而64位系统最大可以支持128G大内存. 2.运算速度不同: 64位系 ...

  5. oa办公系统快速开发工具,助力企业优化升级

    随着互联网的快速发展.信息化 IT 技术的不断进步.移动互联新技术的兴起,不管是大的集团企业还是中小型企业,纸质化的办公模式已不能满足现有需求,构建oa平台,为员工提供高效的办公环境尤其重要. 我们先 ...

  6. snmp服务配置

    snmp服务配置 1. 检查是否安装 snmp rpm -qa |grep snmp 如未安装 rpm –ivh  加包名 (net-snmp-utils 为各种工具包) 2.服务开启 service ...

  7. MySQL的字符集和乱码问题

    1.字符集知识 #概述 .字符集是一套文字符号及其编码.比较规则的集合,第一个计算机字符串ASC2 .mysql数据库字符集包括字符集(character)和 校对规则,其中字符集使用来定义mysql ...

  8. PHPRAP v1.0.6 发布,修复因php7.1版本遗弃mcrypt扩展造成安装失败的BUG

    PHPRAP,是一个PHP轻量级开源API接口文档管理系统,致力于减少前后端沟通成本,提高团队协作开发效率,打造PHP版的RAP. 更新记录 [修复]修复因php7.1版本遗弃mcrypt扩展造成安装 ...

  9. 原生js实现replace方法

    今天看到有人提问js的replace方法怎么实现的,自己就试了试js手册里的String对象的介绍replace大概是这样: string.replace(regexp, replacement) 第 ...

  10. 学h5前端开发前必知的三大流行趋势

    学h5前端开发前必知的三大流行趋势 随着互联网时代的飞速发展,各种互联网的Web应用程序层出不穷,很多人对于HTML5前端开发的过程充满了好奇,但是却没有了解到前端开发的未来发展趋势.下面,云慧学院专 ...