Django如何操作MySQL查询:从基础到高级实践

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

基础查询操作

在Django中,每个模型类都对应一个数据库表,通过模型类的objects管理器可以进行查询。

django如何操作mysql查询,Django高效操作MySQL查询指南

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