[Python]Django 数据库数据的增删改查(三)

简介: [Python]Django 数据库数据的增删改查(三)

5.2.7 日期查询

  • 日期查询
  • year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
# 查询1980年发表的图书
books = BookInfo.objects.filter(pub_date__year='1980')

# 查询1990年1月1日后发表的图书
books = BookInfo.objects.filter(pub_date__gt='1990-1-1')

注意:

日期的格式只能YYYY-MM-DD

5.3 F对象(两个属性进行比较)

之前的查询都是对象的属性与常量值比较,两个属性进行比较,使用F对象,F对象被定义在django.db.models中。

语法:

以filter为例

filter(字段名__运算符=F('字段名'))
from django.db.models import F
# 查询阅读量大于等于评论量的图书。
books = BookInfo.objects.filter(read_count__gt=F('comment_count'))

# 查询阅读量大于2倍评论量的图书。
books = BookInfo.objects.filter(read_count__gt=F('comment_count') * 2)

5.4 Q对象(逻辑或与非查询)

需要实现逻辑或or、逻辑与and、逻辑非not的查询,可以使用Q()对象结合|&~运算符,Q对象被义在django.db.models中。

语法:

Q(属性名__运算符=值)|Q(属性名__运算符=值)|Q(属性名__运算符=值)|···

5.4.1 逻辑与查询

Q对象可以使用&连接,&表示逻辑或。

from django.db.models import Q
# 查询阅读量大于20,并且编号小于3的图书。
# 方法一: 进行多次过滤得到结果
books = BookInfo.objects.filter(read_count__gt=20).filter(id__lt=3)
# 方法二:
books = BookInfo.objects.filter(read_count__gt=20, id__lt=3)
# 方法三:使用Q对象相与
books = BookInfo.objects.filter(Q(read_count__gt=20) & Q(id__lt=3))

5.4.2 逻辑或查询

逻辑或查询只能使用Q对象实现

Q对象可以使用|连接,|表示逻辑或。

# 查询阅读量大于20,或编号小于3的图书
books = BookInfo.objects.filter(Q(read_count__gt=20) | Q(id__lt=3))

5.4.3 逻辑非查询

Q对象前可以使用~操作符,表示逻辑非 not。

# 查询编号不等于3的图书。
books = BookInfo.objects.exclude(id=3)
books = BookInfo.objects.filter(~Q(id=3))

5.5 聚合函数

使用aggregate()过滤器调用聚合函数。

聚合函数包括:Avg平均,Count数量,Max最大,Min最小,Sum求和,被定义在django.db.models中。

语法:

aggregate(聚合函数('字段名'))

注意aggregate的返回值是一个字典类型,格式如下:

{'属性名__聚合类小写':值}
# 导入聚合函数
from django.db.models import Avg, Count, Max, Min, Sum
# 查询图书的总阅读量。
books = BookInfo.objects.aggregate(Sum('read_count'))

5.6 排序

使用order_by()对结果进行排序.

降序排序只需要在指定字段前加一个负号即可

# 根据评论数对所有图书的查询结果进行排序
# 默认升序
books = BookInfo.objects.all().order_by('comment_count')
# 降序
books = BookInfo.objects.all().order_by('-comment_count')

# 根据阅读数和id对所有图书的查询结果进行排序
# 阅读数升序,相同时按照id号升序排序
books = BookInfo.objects.all().order_by('read_count', 'id')
# 阅读数升序,相同时按照id号降序排序
books = BookInfo.objects.all().order_by('read_count', '-id')

5.7 关联查询

5.7.1 由一到多的访问

已知主表数据,关联查询从表数据。

语法:

使用系统内部自动生成的关联模型,关联模型类型小写_set Django会自动生成添加。

主表模型(实例对象).关联模型类型小写_set
# 查询书籍为1的所有人物信息
# 1. 查询id为1的书籍
book = BookInfo.objects.get(id=1)
# 2. 根据书籍关联任务信息
people = book.peopleinfo_set.all()

5.7.2 由多到一的访问

已知从表数据,关联查询主表数据。

语法:

从表模型(实例对象).从表模型中的外键属性
• 1
from book.models import PeopleInfo
# 查询人物为1的书籍信息
# 1. 查询id为1的人物信息
person = PeopleInfo.objects.get(id=1)
# 2. 根据人物信息获取人物对应的书籍信息
book = person.book

5.7.3 关联查询的筛选

系统内部自动生成的关联模型,Django会自动生成添加从表模型作为主表模型类的属性。

# 查询图书,要求图书任务为“郭靖”
# 需要查询的为书籍信息,已知条件为人物信息
# 需要查询的为主表信息,已知条件为从表信息
# 语法:
# filter(关联从表模型类名小写__字段名__运算符=值)
book = BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
# 简写
book = BookInfo.objects.filter(peopleinfo__name='郭靖')

# 查询图书,要求图书中人物的描述包含"八"
book = BookInfo.objects.filter(peopleinfo__description__contains='

从表模型中有一个外键属性

# 需要查询的为人物信息,已知条件为书籍信息
# 需要查询的为从表信息,已知条件为主表信息
# 语法:
# filter(外键__字段名__运算符=值)
# 查询书名为“天龙八部”的所有人物
people = PeopleInfo.objects.filter(book__name__exact='天龙八部')
# 简写
people = PeopleInfo.objects.filter(book__name='天龙八部')
# 查询图书阅读量大于30的所有人物
people = PeopleInfo.objects.filter(book__read_count__gt=30)

5.8 查询集QuerySet

查询集,也称查询结果集(QuerySet),表示从数据库中获取的对象集合。

当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):

  • all():返回所有数据。
  • filter():返回满足条件的数据。
  • exclude():返回满足条件之外的数据。
  • order_by():对结果进行排序。

5.8.1 查询集的特性

  1. 惰性执行
  • 创建查询集不会访问数据库,直到调用查询的数据时,才会访问数据库查询数据。
  1. 缓存
  • 使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。
  • 如果两个查询集无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载。
  • 经过存储后,可以重用查询集,第二次使用缓存中的数据,减少了数据库的查询次数。

5.8.2 限制查询结果集

查询结果集可以看成一个列表,可以对查询集进行下标取值或切片操作。等同于sql中的limit和offset子句。

注意:不支持负数索引。

5.8.3 分页

导入分页模块:

from django.core.paginator import Paginator
from django.core.paginator import Paginator
# 查询结果集
books = BookInfo.objects.all()
# 对查询结果集进行分类
# 需要两个参数
# object_list:需要进行分页的结果集/列表
# per_page:每页多少条记录
# 对books进行分页,每页两条记录
p = Paginator(books, 2)
# 获取第一页的数据
# 返回结果看成列表
# object_list获取分页后的结果集
books_page = p.page(1).object_list

获取每页对应的数据集,得到的为一个Page对象,object_list获取数据集


相关文章
|
8天前
|
缓存 API 网络架构
淘宝item_search_similar - 搜索相似的商品API接口,用python返回数据
淘宝联盟开放平台中,可通过“物料优选接口”(taobao.tbk.dg.optimus.material)实现“搜索相似商品”功能。该接口支持根据商品 ID 获取相似推荐商品,并返回商品信息、价格、优惠等数据,适用于商品推荐、比价等场景。本文提供基于 Python 的实现示例,包含接口调用、数据解析及结果展示。使用时需配置淘宝联盟的 appkey、appsecret 和 adzone_id,并注意接口调用频率限制和使用规范。
|
10天前
|
JSON 安全 API
Python处理JSON数据的最佳实践:从基础到进阶的实用指南
JSON作为数据交换通用格式,广泛应用于Web开发与API交互。本文详解Python处理JSON的10个关键实践,涵盖序列化、复杂结构处理、性能优化与安全编程,助开发者高效应对各类JSON数据挑战。
66 1
|
2月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
2月前
|
JSON 数据挖掘 API
闲鱼商品列表API响应数据python解析
闲鱼商品列表API(Goodfish.item_list)提供标准化数据接口,支持GET请求,返回商品标题、价格、图片、卖家信息等。适用于电商比价、数据分析,支持多语言调用,附Python示例代码,便于开发者快速集成。
|
2月前
|
JSON 自然语言处理 API
闲鱼商品详情API响应数据python解析
闲鱼商品详情API(goodfish.item_get)通过商品ID获取标题、价格、描述、图片等信息,支持Python等多语言调用。本文提供Python请求示例,包含请求构造与数据处理方法。
|
3月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
559 1
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
3月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
202 62
|
2月前
|
SQL 存储 关系型数据库
MySQL功能模块探秘:数据库世界的奇妙之旅
]带你轻松愉快地探索MySQL 8.4.5的核心功能模块,从SQL引擎到存储引擎,从复制机制到插件系统,让你在欢声笑语中掌握数据库的精髓!
|
6月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库

热门文章

最新文章

推荐镜像

更多