在 Django 项目中进行表的查询操作是开发过程中非常常见的任务,可以用来获取表中的特定实例或者实例集合,以便将它们展示给用户、对它们进行修改,等等.在本篇文章中,我们将深入探讨 Django 中表的查询操作的完整攻略.
Django 中查询操作是通过模型对象(即 models.py 中的模型定义)来实现的.最简单的查询方法是对模型进行 "全局查询",即获取模型中的所有实例:
from myapp.models import MyModel
all_instances = MyModel.objects.all()
以上代码查询得到的 all_instances 变量是一个 QuerySet 对象,它可以被当做一个数组来使用,包含了 MyModel 表中所有的实例.
这只是最简单的查询示例.下面我们来逐层拆解 Django 查询的语法.
all() 方法可以获取 MyModel 表中所有的实例.如果只是想获取表中的一个子集,在 QuerySet 对象上使用过滤方法,例如:
result = MyModel.objects.filter(name='John')
如果这个属性是数字,则可以使用大于、小于等方法获取子集:
result = MyModel.objects.filter(number__gt=2)
在 Django 查询中,可以使用以下方法来进行进阶查询:
通过 distinct 方法来去重查询结果,如 MyModel.objects.filter(name='John').distinct()
通过 values 方法来获取表中某些特定列的值,如 MyModel.objects.all().values('name', 'id')
通过 order_by 方法来按照特定字段排序实例,如 MyModel.objects.order_by('name')
通过 annotate 方法可以附加一个计算值到每一个查询结果中,比如计算实例数量.如 MyModel.objects.annotate(num_instances=Count('id'))
Django 还支持使用聚合操作来对表进行处理,例如:
from django.db.models import Avg, Max, Min, Sum
result = MyModel.objects.aggregate(Avg('salary'), Max('salary'), Min('salary'), Sum('salary'))
print(result)
下面我们通过两个场景来演示 Django 查询操作的实际应用.
我们假设有一个学生表,表中有 name、age、address、phone_number的字段.现在我们想要查询一个学生 "Tom" 的个人信息,可以使用如下代码:
student = Student.objects.filter(name='Tom').values('name', 'age', 'address', 'phone_number')
我们假设有一个课程成绩表,表中有学生 name、course_name、score 字段,每个学生参加的课程名称和成绩,我们要查询课程成绩排名前三的学生的信息.
top_three = Scores.objects.filter(course_name='Math').order_by('-score')[:3].values('name', 'score')