Python - Django - ORM F查询和Q查询
models.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(primary_key = True ) name = models.CharField(max_length = 64 , null = False , unique = True ) def __str__( self ): return "<Publisher object: {}>" . format ( self .name) # 书籍 class Book(models.Model): id = models.AutoField(primary_key = True ) title = models.CharField(max_length = 64 , null = False , unique = True ) price = models.DecimalField(max_digits = 5 , decimal_places = 2 , default = 00.00 ) # 最长位数为 5,小数位数为 2,默认值为 00.00 publisher = models.ForeignKey(to = "Publisher" , null = True ) # 把 null 设置为 True sell_num = models.IntegerField(default = 0 ) # 书籍的卖出数量 inventory_num = models.IntegerField(default = 1000 ) # 书籍的库存数量 def __str__( self ): return "<Book object: {}>" . format ( self .title) # 作者 class Author(models.Model): id = models.AutoField(primary_key = True ) name = models.CharField(max_length = 16 , null = False , unique = True ) book = models.ManyToManyField(to = "Book" ) # 多对多关联 Book 表,ORM 会自动生成第 3 张表 def __str__( self ): return "<Author object: {}>" . format ( self .name) |
book 表:
更改一下库存量和卖出量
F 查询:
如果要比较一个表中的两个不同的字段,可以使用 F 查询
orm.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import os if __name__ = = '__main__' : # 加载 Django 项目的配置信息 os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "mysite2.settings" ) # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models from django.db.models import F # 查询出库存量大于卖出量的书(两个字段做比较) ret = models.Book.objects. filter (inventory_num__gt = F( "sell_num" )) print (ret) |
运行结果:
F() 对象之间以及 F() 对象和常数之间可以进行加减乘除和取模的操作。
orm.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import os if __name__ = = '__main__' : # 加载 Django 项目的配置信息 os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "mysite2.settings" ) # 导入 Django,并启动 Django 项目 import django django.setup() from django.db.models import F # 卖出量 +1,再乘 3 models.Book.objects.update(sell_num = (F( "sell_num" ) + 1 ) * 3 ) |
运行结果:
使用 F 查询修改 char 字段
orm.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import os if __name__ = = '__main__' : # 加载 Django 项目的配置信息 os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "mysite2.settings" ) # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models # 给每一本书的书名后面加上 “第一版” from django.db.models.functions import Concat from django.db.models import Value models.Book.objects.update(title = Concat(F( "title" ), Value( "第一版" ))) |
运行结果:
具体的对象没有 update() 方法,需要使用 save() 方法,QuerySet 对象有 update() 方法
Q 查询:
如果需要执行 or 操作,可以使用 Q 查询
orm.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import os if __name__ = = '__main__' : # 加载 Django 项目的配置信息 os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "mysite2.settings" ) # 导入 Django,并启动 Django 项目 import django django.setup() from django.db.models import Q # 查询卖出量大于 1000,且库存量小于 500 的书 ret = models.Book.objects. filter (sell_num__gt = 1000 , inventory_num__lt = 500 ) print (ret) # 查询卖出量大于 1500,或者库存量小于 200 的书 ret = models.Book.objects. filter (Q(sell_num__gt = 1500 ) | Q(inventory_num__lt = 200 )) print (ret) |
运行结果:
Q 查询和字段查询同时存在时, 字段查询要放在 Q 查询的后面
orm.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import os if __name__ = = '__main__' : # 加载 Django 项目的配置信息 os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "mysite2.settings" ) # 导入 Django,并启动 Django 项目 import django django.setup() from django.db.models import Q # Q 查询和字段查询同时存在时, 字段查询要放在 Q 查询的后面 # 查询卖出量大于 1500,或者库存量小于 200,且 title 包含 P 的书 ret = models.Book.objects. filter (Q(sell_num__gt = 1500 ) | Q(inventory_num__lt = 200 ), title__contains = "P" ) print (ret) |
运行结果:
分类:
Django
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2018-08-05 Linux - 目录结构及文件操作