Django高级查询:一对多与多对多操作及分组聚合实例
168 浏览量
更新于2024-08-29
收藏 72KB PDF 举报
在Django中,数据操作和查询是开发过程中必不可少的部分,特别是在涉及到多表关联时。本文将详细介绍Django中的分组聚合查询,包括一对多和多对多关系的增删改操作,以及基于对象和双下划线的查询方式。
1. **多表查询与增删改**
- 一对多关系:在创建对象时,通常采用"先一后多"的方式,例如,创建`Publish`对象后,通过外键关联到`Book`模型。外键可以绑定对象本身或依赖表的主键,如`publish = Publish.objects.create()`,然后通过`Book.objects.create(publish=publish)`或者`publish_id=publish.id`来添加书籍。
- 删除操作:Django默认支持级联删除,当删除一个关联对象时,其子对象也会随之删除,除非有特定的保护设置。
- 修改操作:改变一个`Book`对象的外键时,由于外键的存在,必须确保关联的对象已经存在。对于多对多关系,可以通过`.add()`方法添加作者对象,`clear()`或`remove()`方法删除作者,或使用`set([作者对象们|主键们])`替换所有作者。
2. **查询操作**
- 基于对象的查询:可以直接访问对象的属性,如`book.publish.first().name`。反向查询则通过类名小写加上下划线,如`publish.book_set.first().name`。
- 基于双下划线的查询语法:利用`values()`函数获取特定字段的结果,如`Book.objects.filter(id=1).values('publish__name')[0]`,或查询特定关系字段,如`publish.values('book__name')`。
3. **分组查询与聚合函数**
- Django提供了一系列聚合函数,如`Max`, `Min`, `Sum`, `Avg`, `Count`,用于查询结果的汇总统计。例如,单独聚合整个表可以使用`aggregate(Max(price))`,分组聚合则需配合`group_by()`,如`Book.objects.group_by(publish).annotate(high_price=Max(price))`。
- 聚合查询的使用场景包括:单独查询时不分组,只得到单一聚合结果;在分组情况下,根据指定字段进行分组,并获取分组字段和聚合结果。
4. **聚合函数的应用**
- 在Django ORM中,聚合函数的语法是`aggregate(别名=聚合函数('字段'))`。可以同时对多个字段进行聚合处理,比如`aggregate(total_price=Sum('price'), count_books=Count('id'))`。
总结来说,Django的强大之处在于其灵活的查询机制,特别是针对多对多和一对多关系的处理,以及对聚合函数的直观应用。熟练掌握这些技巧有助于开发者更高效地管理数据库操作和数据分析。
2020-09-18 上传
2020-09-20 上传
点击了解资源详情
点击了解资源详情
2020-12-20 上传
2020-09-18 上传
2021-01-20 上传
2021-01-21 上传
2020-12-17 上传
weixin_38698590
- 粉丝: 6
- 资源: 943
最新资源
- 深入浅出:自定义 Grunt 任务的实践指南
- 网络物理突变工具的多点路径规划实现与分析
- multifeed: 实现多作者间的超核心共享与同步技术
- C++商品交易系统实习项目详细要求
- macOS系统Python模块whl包安装教程
- 掌握fullstackJS:构建React框架与快速开发应用
- React-Purify: 实现React组件纯净方法的工具介绍
- deck.js:构建现代HTML演示的JavaScript库
- nunn:现代C++17实现的机器学习库开源项目
- Python安装包 Acquisition-4.12-cp35-cp35m-win_amd64.whl.zip 使用说明
- Amaranthus-tuberculatus基因组分析脚本集
- Ubuntu 12.04下Realtek RTL8821AE驱动的向后移植指南
- 掌握Jest环境下的最新jsdom功能
- CAGI Toolkit:开源Asterisk PBX的AGI应用开发
- MyDropDemo: 体验QGraphicsView的拖放功能
- 远程FPGA平台上的Quartus II17.1 LCD色块闪烁现象解析