在Django中,模型(Model)是与数据库表进行交互的桥梁。通过模型,你可以执行数据的增删改查(CRUD)操作。以下是对Django模型操作的详细扩展,包括数据查询的高级用法。
数据查询
基本查询
获取单个对象
student = Student.objects.get(pk=1) # 获取主键为1的学生对象
注意:如果查询不到对象,
get()
方法会抛出DoesNotExist
异常。获取多个对象
students = Student.objects.all() # 获取所有学生对象
all()
方法返回一个 QuerySet 对象,它类似于一个列表,包含所有匹配的对象。
过滤查询
使用
filter()
方法female_students = Student.objects.filter(sex='f') # 获取所有性别为女的学生
filter()
方法返回满足条件的 QuerySet 对象。排除查询
non_female_students = Student.objects.exclude(sex='f') # 获取所有性别不为女的学生
exclude()
方法返回不满足条件的 QuerySet 对象。
排序查询
使用
order_by()
方法students_sorted_by_name = Student.objects.all().order_by('name') # 按名字排序 students_sorted_by_name_desc = Student.objects.all().order_by('-name') # 按名字降序排序
链式查询
你可以将多个查询方法链式调用,以构建更复杂的查询。
female_students_sorted_by_age = Student.objects.filter(sex='f').order_by('age')
聚合查询
使用
aggregate()
方法from django.db.models import Avg, Sum, Count, Max, Min average_age = Student.objects.all().aggregate(Avg('age')) # 计算平均年龄 total_students = Student.objects.all().aggregate(Count('id')) # 计算总人数
F 表达式和 Q 表达式
F 表达式
F 表达式允许你在查询中引用字段的值。
from django.db.models import F # 将每个学生的年龄增加1 Student.objects.all().update(age=F('age') + 1)
Q 表达式
Q 表达式用于构建复杂的查询条件。
from django.db.models import Q # 获取年龄大于18且性别为男,或者名字为'张三'的学生 students = Student.objects.filter(Q(age__gt=18, sex='m') | Q(name='张三'))
关联查询
如果你的模型之间存在外键关系,你可以进行关联查询。
正向查询
class Class(models.Model): name = models.CharField(max_length=100) class Student(models.Model): name = models.CharField(max_length=100) class_id = models.ForeignKey(Class, on_delete=models.CASCADE) # 获取某个班级的所有学生 class_instance = Class.objects.get(pk=1) students = class_instance.student_set.all() # student_set 是自动生成的关联管理器
反向查询
# 获取某个学生的班级 student = Student.objects.get(pk=1) class_instance = student.class_id # 直接访问外键字段
注意事项
- 性能优化:尽量避免在循环中执行数据库查询,使用 QuerySet 的批量操作来提高性能。
- 安全性:使用 Django 的 ORM 进行查询时,可以防止 SQL 注入攻击。
- 事务处理:对于需要原子性操作的多个数据库操作,可以使用 Django 的事务管理功能。
通过掌握这些高级查询技巧,你可以更高效地与数据库进行交互,构建出功能强大的 Django 应用。