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

  • Post category:Python

Django 的 values() 是 ORM 操作中一个非常有用的函数,它可以用来对数据进行筛选、聚合、过滤等操作,同时还能实现将 QuerySet 转化为字典,用于序列化等需求。

作用

values() 函数可以将查询结果转化为字典格式,以便在序列化时能够更方便地在 Django 项目中进行数据传输。同时,它还可以对查询结果进行去重、筛选、聚合等操作,从而得到满足特定需求的数据结果。

用法

values() 的基本用法为:

Model.objects.values(*fields)

其中 Model 为数据表对应的 Model,fields 为需要查询的字段,可选参数。

示例1

from myapp.models import Author

# 获取所有作者的姓名以及国籍,返回值为字典列表
authors = Author.objects.values('name', 'nationality')

示例2

from myapp.models import Book

# 获取2022年之后的所有书籍,并按照价格从大到小排序
books = Book.objects.filter(publication_date__year__gte=2022)\
            .order_by('-price')\
            .values('title', 'price')

在上述示例中,我们先对 Book 模型进行筛选,找出满足条件的书籍数量,并按照价格从大到小排序,最后将查询到的书籍的标题和价格以字典列表的形式返回。

实例3

from myapp.models import Author

# 按国籍统计每个国籍的作者数量,并返回国籍和作者数量的字典列表
author_count_by_nationality = Author.objects.values('nationality')\
                                        .annotate(author_count=Count('id'))\
                                        .order_by('-author_count')

在上述示例中,我们利用 values() 函数生成字典列表,使用 annotate() 函数对结果进行聚合统计,并使用 order_by() 函数按照作者数量从多到少排序。

注意事项

  • values() 函数不会影响主查询结果的类型,其返回值为一个 QuerySet 对象(即可以使用所有 QuerySet 的操作方法)。
  • 若查询结果为空,则 values() 函数将返回空列表[]。
  • 当设置 fields 参数时,返回的字典会按照所设置字段的顺序进行排序。
  • values() 函数中不能使用聚合函数以及 F、Q 等查询条件。

总结

values() 函数可以很方便地将查询结果转化为字典列表,并支持对结果进行筛选、聚合等操作,是 Django ORM 中十分常用的函数之一。在实际的开发中,开发者可以灵活利用 values() 函数生成满足自己需求的结果。