Django ORM 提供了一系列强大的查询工具对象,用于构建复杂、高效的数据库查询。这些工具可以单独使用,也可以组合使用,以满足各种数据操作需求。以下是主要查询工具对象的详细解析:
一、核心查询对象
1. Q 对象 - 复杂条件查询
- 作用:构建包含 AND、OR、NOT 逻辑的复杂查询条件
- 典型应用:
from django.db.models import Q # OR 查询 User.objects.filter(Q(username='admin') | Q(email='admin@example.com')) # AND 查询 User.objects.filter(Q(is_active=True) & Q(is_staff=True)) # NOT 查询 User.objects.filter(~Q(status='banned'))
2. F 对象 - 字段引用与原子操作
- 作用:引用字段值并执行原子操作,避免竞态条件
- 典型应用:
from django.db.models import F # 原子更新 Product.objects.filter(id=1).update(stock=F('stock') - 1) # 字段比较 Article.objects.filter(views__gt=F('comments')) # 数学运算 Product.objects.update(price=F('price') * 1.1)
二、高级查询工具
3. Prefetch 对象 - 关联查询优化
- 作用:精细控制预取关联对象
- 典型应用:
from django.db.models import Prefetch Book.objects.prefetch_related( Prefetch('authors', queryset=Author.objects.filter(active=True)) )
4. Case/When 对象 - 条件表达式
- 作用:实现类似 SQL CASE WHEN 的条件逻辑
- 典型应用:
from django.db.models import Case, When, Value User.objects.annotate( user_type=Case( When(is_staff=True, then=Value('staff')), When(is_superuser=True, then=Value('admin')), default=Value('regular') ) )
5. Subquery/OuterRef 对象 - 子查询
- 作用:构建相关子查询
- 典型应用:
from django.db.models import Subquery, OuterRef latest_comments = Comment.objects.filter( article=OuterRef('pk') ).order_by('-created_at')[:1] Article.objects.annotate( last_comment=Subquery(latest_comments.values('text')) )
三、聚合与表达式
6. 聚合函数
- 常用函数:Avg, Count, Max, Min, Sum, StdDev, Variance
- 典型应用:
from django.db.models import Avg, Count Book.objects.aggregate( avg_price=Avg('price'), total_authors=Count('authors') )
7. Window 函数 - 窗口函数
- 作用:实现分区、排序等高级分析功能
- 典型应用:
from django.db.models import Window, F from django.db.models.functions import Rank Product.objects.annotate( rank=Window( expression=Rank(), partition_by=[F('category')], order_by=F('sales').desc() ) )
8. ExpressionWrapper - 类型处理
- 作用:处理混合类型的表达式
- 典型应用:
from django.db.models import ExpressionWrapper, F, DurationField Task.objects.annotate( delay=ExpressionWrapper( F('actual_end') - F('planned_end'), output_field=DurationField() ) )
四、原生SQL支持
9. RawSQL - 原生SQL片段
- 作用:在ORM中嵌入原生SQL
- 典型应用:
from django.db.models.expressions import RawSQL Restaurant.objects.annotate( distance=RawSQL( "ST_Distance(location, ST_MakePoint(%s, %s))", [longitude, latitude] ) )
五、函数表达式
10. Func 表达式 - 数据库函数
- 作用:调用数据库函数
- 典型应用:
from django.db.models import Func, F, Value Author.objects.annotate( initials=Func( F('first_name'), Value(' '), F('last_name'), function='CONCAT' ) )
最佳实践总结
- 优先使用ORM:尽量使用这些工具对象而非原生SQL
- 性能考量:F对象用于原子更新,Prefetch用于优化关联查询
- 组合使用:这些对象可以相互组合实现复杂查询
- 类型安全:注意使用ExpressionWrapper处理混合类型
- 可读性:复杂查询应适当拆分或添加注释
掌握这些查询工具对象,可以让你在Django项目中构建出既高效又易于维护的数据库查询逻辑,同时保持代码的Pythonic风格。