Django如何操作MySQL查询:从基础到高级实践
Django通过其强大的ORM(对象关系映射)系统,可以高效、安全地操作MySQL数据库进行查询,开发者无需编写原生SQL语句即可完成大多数数据库操作。 这一设计不仅提升了开发效率,还通过参数化查询有效防止了SQL注入攻击,确保了应用的安全性,下面我们将从基础查询到高级技巧,全面解析Django操作MySQL查询的方法。
基础查询操作
在Django中,每个模型类都对应一个数据库表,通过模型类的objects管理器可以进行查询。

1 获取所有数据
# 获取User模型对应的所有记录 users = User.objects.all()
2 条件查询
Django提供了多种条件查询方法,最常用的是filter()和exclude():
# 获取年龄大于18的用户 adult_users = User.objects.filter(age__gt=18) # 获取非活跃用户 inactive_users = User.objects.filter(is_active=False) # 排除管理员用户 non_admin_users = User.objects.exclude(is_admin=True)
3 获取单个对象
# 通过主键获取 user = User.objects.get(pk=1) # 通过唯一字段获取 user = User.objects.get(username='john_doe')
查询字段操作
1 字段查找类型
Django提供了丰富的字段查找类型,使用双下划线语法:
# 精确匹配 users = User.objects.filter(username__exact='john') # 包含查询(区分大小写) users = User.objects.filter(username__contains='doe') # 包含查询(不区分大小写) users = User.objects.filter(username__icontains='doe') # 范围查询 users = User.objects.filter(age__range=(18, 30)) # 日期查询 from datetime import date users = User.objects.filter(created_at__date=date.today())
2 关联查询
# 外键关联查询 articles = Article.objects.filter(author__username='john') # 反向关联查询 user = User.objects.get(username='john') articles = user.article_set.all()
查询结果处理
1 排序
# 升序排列
users = User.objects.all().order_by('created_at')
# 降序排列
users = User.objects.all().order_by('-created_at')
# 多字段排序
users = User.objects.all().order_by('is_active', '-created_at')
2 切片与限制
# 获取前10条记录 users = User.objects.all()[:10] # 获取第11-20条记录 users = User.objects.all()[10:20]
3 聚合与统计
from django.db.models import Count, Avg, Max, Min, Sum
# 统计用户数量
user_count = User.objects.count()
# 分组统计
from django.db.models import Count
result = User.objects.values('city').annotate(total=Count('id'))
# 计算平均值
avg_age = User.objects.aggregate(Avg('age'))
高级查询技巧
1 Q对象复杂查询
from django.db.models import Q
# OR查询
users = User.objects.filter(Q(age__lt=18) | Q(age__gt=65))
# AND查询
users = User.objects.filter(Q(is_active=True) & Q(is_verified=True))
# 复杂组合
users = User.objects.filter(
Q(age__gte=18) &
(Q(city='北京') | Q(city='上海'))
)
2 F对象字段比较
from django.db.models import F
# 比较同一记录的不同字段
users = User.objects.filter(income__gt=F('expense') * 2)
# 更新时使用字段值
User.objects.filter(is_vip=True).update(credit=F('credit') + 100)
3 原生SQL查询
当ORM无法满足复杂需求时,可以使用原生SQL:
from django.db import connection
# 执行原生查询
with connection.cursor() as cursor:
cursor.execute("SELECT * FROM auth_user WHERE age > %s", [18])
rows = cursor.fetchall()
# 使用raw()方法
users = User.objects.raw('SELECT * FROM auth_user WHERE age > %s', [18])
性能优化
1 select_related预取外键
未经允许不得转载! 作者:HTML前端知识网,转载或复制请以超链接形式并注明出处HTML前端知识网。
原文地址:https://www.html4.cn/13660.html发布于:2026-08-28





