Python - Django - ORM 查询方法
models.py:
1 2 3 4 5 6 7 8 | from django.db import models class Human(models.Model): id = models.AutoField(primary_key = True ) name = models.CharField(max_length = 32 ) age = models.IntegerField() birthday = models.DateField(auto_now_add = True ) |
在数据库中添加几条数据
在 Python 脚本中调用 Django 环境:
在 mysite2 下创建 orm_test.py
在 orm_test.py 中添加以下内容:
1 2 3 4 5 6 7 8 | import os if __name__ = = '__main__' : # 加载 Django 项目的配置信息 os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "mysite2.settings" ) # 导入 Django,并启动 Django 项目 import django django.setup() |
ORM 操作:
all():查询所有结果
orm_test.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 app01 import models ret = models.Human.objects. all () print (ret) |
运行结果:
返回 QuerySet 对象,QuerySet 对象继承列表,所以可以使用列表的操作
get():返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
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 app01 import models ret_id = models.Human.objects.get( id = 2 ) print (ret_id) ret_name = models.Human.objects.get(name = "Alex" ) print (ret_name) |
运行结果:
filter():返回与所给筛选条件相匹配的对象
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 app01 import models ret = models.Human.objects. filter ( id = 3 ) print (ret) |
运行结果:
返回了一个列表
如果没有匹配上的话,不会报错,会返回一个空值
exclude():返回与所给筛选条件不匹配的对象
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 app01 import models ret = models.Human.objects.exclude( id = 1 ) print (ret) |
运行结果:
返回除 id=1 外的所以数据
values():返回一个 ValueQuerySet,一个特殊的 QuerySet,运行后得到的并不是一系列 model 的实例化对象,而是一个可迭代的字典序列
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 app01 import models # 返回所有字段名为 name 的数据 ret = models.Human.objects.values( "name" ) print (ret) # 返回所有字段名为 name 和 birthday 的数据 ret1 = models.Human.objects.values( "name" , "birthday" ) print (ret1) |
运行结果:
返回的是字典类型
values_list():与 values() 相似,它返回的是一个元组序列,values 返回的是一个字典序列
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 app01 import models ret = models.Human.objects.values_list( "name" ) print (ret) |
运行结果:
count():返回数据库中匹配查询 QuerySet 的对象个数
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 app01 import models ret = models.Human.objects. all ().count() print (ret) |
运行结果:
first():返回第一条记录
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 app01 import models ret = models.Human.objects. all ().first() print (ret) |
运行结果:
last():返回最后一条记录
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 app01 import models ret = models.Human.objects. all ().last() print (ret) |
运行结果:
exists():如果 QuerySet 包含数据,就返回 True,否则返回 False
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 app01 import models ret = models.Human.objects. all ().exists() print (ret) |
运行结果:
order_by():对查询结果按照某字段进行排序
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 app01 import models ret = models.Human.objects.order_by( "name" ) print (ret) |
运行结果:
name 按照字母顺序进行了排序
在生成表的时候也可以指定默认的排序方法
models.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from django.db import models class Human(models.Model): id = models.AutoField(primary_key = True ) name = models.CharField(max_length = 32 ) age = models.IntegerField() birthday = models.DateField(auto_now_add = True ) def __str__( self ): return "<Human Object: {}>" . format ( self .name) # 按照 name 排序 class Meta: ordering = ( "name" ,) |
这样生成的表在数据中就按 name 的字母顺序来排序
reverse():对查询结果反向排序
reverse() 通常只能在具有已定义顺序的 QuerySet 上调用(在model 类的 Meta 中指定 ordering 或调用 order_by() 方法)
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 app01 import models ret = models.Human.objects.order_by( "name" ).reverse() print (ret) |
运行结果:
distinct():从返回结果中剔除重复纪录(如果查询跨越多个表,可能在计算 QuerySet 时得到重复的结果。此时可以使用 distinct(),注意只有在 PostgreSQL 中支持按字段去重)
【推荐】国内首个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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架