详解Django的 values() 函数:获取指定字段的值

  • Post category:Python

Django的values()函数是一个查询集方法,它可以让我们以数据字典的形式返回指定列的值,以达到优化查询的目的。在这个过程中,我们可以使用一些关键字参数来控制values()的输出结果。下面是详细的介绍和示例:

values函数的基本使用

我们可以在查询集上使用values()方法来获取指定列的值,例如:

# 获取Person模型中所有人名和年龄的数据字典数组
persons = Person.objects.values('name', 'age')

这行代码返回一个包含Person模型中每个对象指定列的数据字典数组。默认情况下,每个字典将生成一个键(关键字)和一个值对应于给定列名的值。如果在values方法中传递一个列名列表,那么我们将获取所有的列值。

values()函数附加关键字参数

除了列名,我们还可以使用一些关键字参数来控制查询结果:

  • flat:将values()的结果扁平化为一个简单的列表。例如,获取一列人名的列表:

python
# 获取Person模型中所有人名的列表
name_list = Person.objects.values_list('name', flat=True)

这将返回[‘Alex’, ‘John’, ‘Mary’],而不是[{ ‘name’: ‘Alex’ }, { ‘name’: ‘John’ }, { ‘name’: ‘Mary’ }]的列表。

  • distinct:去重,产生唯一的结果。例如,我们可以通过使用distinct关键字来获得不同的颜色:

python
# 获取Car模型中不同的颜色列表
colors = Car.objects.values('color').distinct()

这将返回一个包含Car模型中不同颜色的数据字典数组。

values()函数的返回结果

values()方法返回一个QuerySet对象。可以像执行查询一样使用它。例如:

for p in Person.objects.values('name', 'age'):
    print(p)

这将输出:

{ 'name': 'Alex', 'age': 35 }
{ 'name': 'John', 'age': 28 }
{ 'name': 'Mary', 'age': 25 }

带外键的模型

当我们在查询一个与外键相关联的模型时,我们可以使用双下划线指定外键模型中的字段:

# 获取所有Car模型及其所属Person模型的name属性
cars = Car.objects.values('model', 'person__name')

这行代码将返回Car模型与所属Person模型的name属性值的数据字典数组。在这个例子中,我们使用双下划线进行关联,因此我们得到了如下结果:

[
  { 'model': 'Ford', 'person__name': 'Alex' },
  { 'model': 'Volkswagen', 'person__name': 'John' },
  { 'model': 'Toyota', 'person__name': 'Mary' },
  ...
]

带聚合函数的查询

我们也可以将值传递给聚合函数:

from django.db.models import Sum

# 获取Person模型中所有人的年龄总和
total_age = Person.objects.values('name').aggregate(total_age=Sum('age'))
print(total_age) # { 'total_age': 88 }

在这个例子中,我们使用aggregate函数将所有Person模型的age值求和。我们还通过values()将结果限制为仅包括name列和一个total_age键。

通过使用这些基本和高级values()函数,我们可以轻松地优化查询,并从我们的Django应用程序中获取准确的数据。