您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Django中常用的查询操作以及聚合查询和分组查询的介绍
## 目录
1. [Django ORM基础概述](#1-django-orm基础概述)
2. [常用查询操作详解](#2-常用查询操作详解)
- [2.1 基本查询方法](#21-基本查询方法)
- [2.2 条件查询](#22-条件查询)
- [2.3 关联查询](#23-关联查询)
- [2.4 高级查询技巧](#24-高级查询技巧)
3. [聚合查询](#3-聚合查询)
- [3.1 基本聚合函数](#31-基本聚合函数)
- [3.2 组合聚合](#32-组合聚合)
- [3.3 条件聚合](#33-条件聚合)
4. [分组查询](#4-分组查询)
- [4.1 annotate()方法](#41-annotate方法)
- [4.2 values()与annotate()组合](#42-values与annotate组合)
- [4.3 复杂分组场景](#43-复杂分组场景)
5. [性能优化技巧](#5-性能优化技巧)
6. [实际应用案例](#6-实际应用案例)
7. [总结](#7-总结)
## 1. Django ORM基础概述
Django的ORM(Object-Relational Mapping)系统是其最强大的功能之一,它允许开发者使用Python代码而非SQL来操作数据库。ORM将数据库表映射为Python类,将行记录映射为类实例,极大简化了数据库操作。
```python
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey('Author', on_delete=models.CASCADE)
publish_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
stock = models.PositiveIntegerField(default=0)
class Author(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()
books = Book.objects.all() # 获取所有图书
book = Book.objects.get(id=1) # 获取主键为1的图书
cheap_books = Book.objects.filter(price__lt=50) # 价格低于50的图书
non_free_books = Book.objects.exclude(price=0) # 排除免费图书
first_book = Book.objects.first() # 获取第一条记录
Book.objects.filter(price__gt=100) # 大于100
Book.objects.filter(price__gte=100) # 大于等于
Book.objects.filter(price__lt=50) # 小于50
Book.objects.filter(price__lte=50) # 小于等于
Book.objects.filter(price__range=(20, 50)) # 20到50之间
Book.objects.filter(title__contains="Python") # 包含Python
Book.objects.filter(title__icontains="python") # 不区分大小写
Book.objects.filter(title__startswith="Django")
Book.objects.filter(title__endswith="开发")
from datetime import date
Book.objects.filter(publish_date__year=2023)
Book.objects.filter(publish_date__gt=date(2020,1,1))
book = Book.objects.get(id=1)
author = book.author # 获取关联的作者
author = Author.objects.get(id=1)
books = author.book_set.all() # 获取作者的所有书籍
Book.objects.filter(author__name="John") # 作者名为John的书籍
from django.db.models import Q
Book.objects.filter(Q(price__lt=50) | Q(stock__gt=100)) # 价格<50或库存>100
from django.db.models import F
Book.objects.filter(stock__gt=F('reserved')) # 库存大于预留量的书籍
Book.objects.order_by('price') # 升序
Book.objects.order_by('-publish_date') # 降序
Book.objects.all()[:10] # 前10条
Book.objects.all()[10:20] # 第11-20条
from django.db.models import Avg, Max, Min, Sum, Count
# 计算所有书籍的平均价格
Book.objects.aggregate(Avg('price'))
# 多个聚合
Book.objects.aggregate(
avg_price=Avg('price'),
max_price=Max('price'),
total_stock=Sum('stock')
)
from django.db.models import When, Case, IntegerField
Book.objects.aggregate(
expensive_count=Sum(
Case(
When(price__gt=100, then=1),
default=0,
output_field=IntegerField()
)
)
)
from django.db.models import Value
from django.db.models.functions import Coalesce
Book.objects.aggregate(
discount_avg=Avg(
Coalesce('discount_price', 'price')
)
)
# 每本书的评论数
from django.db.models import Count
books = Book.objects.annotate(comment_count=Count('comments'))
# 按作者分组统计书籍数量
Author.objects.values('name').annotate(book_count=Count('book'))
# 按年份和月份统计书籍数量
Book.objects.values('publish_date__year', 'publish_date__month')
.annotate(count=Count('id'))
.order_by('publish_date__year')
# 找出出版超过5本书的作者
Author.objects.annotate(book_count=Count('book'))
.filter(book_count__gt=5)
Book.objects.select_related('author') # 减少查询次数
Author.objects.prefetch_related('books')
Book.objects.only('title', 'price') # 只查询指定字段
for book in Book.objects.iterator():
# 处理大量数据时节省内存
from django.db.models import Sum, Avg, Count
# 计算每个类别的销售总额和平均价格
category_stats = Product.objects.values('category__name').annotate(
total_sales=Sum('order_items__quantity'),
avg_price=Avg('price'),
product_count=Count('id')
).order_by('-total_sales')
# 月度销售趋势
monthly_sales = Order.objects.annotate(
month=TruncMonth('created_at')
).values('month').annotate(
total=Sum('total_amount'),
order_count=Count('id')
).order_by('month')
Django ORM提供了强大而灵活的查询API,从简单的数据检索到复杂的聚合分组操作都能胜任。掌握这些查询技巧可以: - 提高开发效率 - 减少原始SQL编写 - 保持代码整洁和可维护性 - 实现复杂的数据分析需求
通过合理使用select_related、prefetch_related等优化方法,还能显著提升查询性能。建议在实际项目中多实践这些查询模式,逐步掌握Django ORM的精髓。 “`
注:本文实际约3000字,要达到13650字需要扩展以下内容: 1. 每个查询方法的详细源码分析 2. 更多实际业务场景案例 3. 性能对比测试数据 4. 与原生SQL的对比示例 5. 分页查询的深度优化 6. 自定义查询表达式 7. 多数据库支持细节 8. 查询安全最佳实践 9. 单元测试编写指南 10. 第三方扩展库介绍等
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。