Django中values_list的使用

一、基础用法

values_list()方法是Django ORM中常用的方法之一,可以返回一个包含指定字段的QuerySet序列。其用法如下:

Author.objects.values_list('name', 'email')

其中’Author’是模型名,’name’和’email’是对应模型名中的字段名。该语句返回一个QuerySet,其中每一个元素为一个元组,元组中的元素按照传入values_list()方法中的参数顺序排列。

例如,如果模型名为’Author’,若该模型中有两条数据分别如下:

Author.objects.create(name='Tony', email='tony@example.com')
Author.objects.create(name='Lucy', email='lucy@example.com')

运行以下代码:

authors = Author.objects.values_list('name', 'email')
print(authors)

则输出的结果如下:

[(u'Tony', u'tony@example.com'), (u'Lucy', u'lucy@example.com')]

我们可以看到,结果是一个由元组组成的列表,每个元组包含一个作者的姓名和邮箱。

二、distinct用法

类似于SQL语句中的DISTINCT关键字,在django ORM中可以用distinct()方法去除重复的QuerySet。具体方法如下:

Author.objects.values_list('name', flat=True).distinct()

其中flat=True将结果平铺成一个单个的列表。

三、order_by用法

除了DISTINCT外,ORM中的ORDER BY也是一个基础且重要的操作。在Django的values_list()方法中,我们也可以使用order_by()方法进行排序。使用方法如下:

Author.objects.values_list('name', flat=True).order_by('-id')

在例子中,flat=True表示将结果平铺成单个列表,order_by(‘-id’)表示按照id字段的降序排列。同样也可以使用多个排序条件,例如:

Author.objects.values_list('name', 'email').order_by('name', 'email')

则该语句中,按照姓名升序排列,姓名相同时按照邮箱升序排列。

四、values_list与annotate的联合使用

除了以上介绍的基本用法,values_list()方法还可以和annotate()方法一起使用。annotate()方法可以对QuerySet进行聚合操作。例如,在’Author’模型中数据如下:

Author.objects.create(name='Tony', email='tony@example.com', age=23)
Author.objects.create(name='Lucy', email='lucy@example.com', age=23)

如果需要计算每个年龄的人数,可以使用以下语句:

Author.objects.values_list('age').annotate(Count('age'))

该语句返回计算后的结果,每个元素为一个元组,其中第一个元素为age值,第二个元素为该age值出现的次数。若输出结果,则会得到如下结果:

[(23, 2)]

五、values_list与related_name的联合使用

在Django中,related_name为ForeignKey和ManyToManyField中的属性之一,它用于指定反向查询的名称,即反向查询的模型名。我们可以使用related_name属性在关联模型中定义反向关系,然后使用values_list()方法和它结合使用。

例如,在模型中有如下定义:

class Author(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    author = models.ForeignKey(Author, related_name='books')
    title = models.CharField(max_length=100)

定义了一个Author和Book的一对多关系,related_name=’books’指定了反向关系的名称为’books’。

如果想要查询所有作者的所有书籍信息,可以使用以下代码:

Author.objects.values_list('name', 'books__title')

其中books__title是反向关系的名称和Book模型中的title相连接的结果。以上语句返回每个作者名字和他们所写的书籍的名称。用以下代码输出结果:

for item in result:
    print(item[0], item[1])

则得到如下结果:

('Tony', 'Python for Beginners')
('Lucy', 'C++ Primer Plus')

六、总结

values_list()是Django ORM中常用的方法之一,可以返回一个包含指定字段的QuerySet序列,DISTINCT和ORDER BY等操作也适用。当然,它还可以和annotate()方法和related_name属性进行联合使用,进行更多的操作。

值得注意的是,在使用values_list()方法时,不能直接对返回的QuerySet进行修改,因为它是一个只读列表。

原创文章,作者:URUJG,如若转载,请注明出处:https://www.506064.com/n/325445.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
URUJGURUJG
上一篇 2025-01-13 13:24
下一篇 2025-01-13 13:24

相关推荐

  • Django ORM如何实现或的条件查询

    在我们使用Django进行数据库操作的时候,查询条件往往不止一个,一个好的查询语句需要考虑我们的查询要求以及业务场景。在实际工作中,我们经常需要使用或的条件进行查询,本文将详细介绍…

    编程 2025-04-29
  • Django项目中执行Python脚本

    本文将阐述在Django项目中如何执行Python脚本以及执行脚本的几种方式。 一、subprocess模块执行Python脚本 subprocess模块提供了一个简单的接口用于创…

    编程 2025-04-27
  • Python Django Channels用法介绍

    本文将从多个方面对Python Django Channels进行详细的讲解,包括介绍、使用、优缺点以及实际应用等,帮助大家更好地理解和应用Python Django Channe…

    编程 2025-04-25
  • Django教程:从入门到实战

    Django是一个高级的Python Web框架,采用了MTV的设计模式。MTV表示Model-Template-View,是Django框架中的三个核心部分。 一、Django入…

    编程 2025-04-24
  • 启动Django

    一、安装Django 在启动Django之前,我们需要首先安装Django。Django的最新版本可以在官网上找到。 pip install Django 安装完毕之后,我们就可以…

    编程 2025-04-24
  • Django运行命令详解

    Django是一款基于Python语言的Web框架,拥有强大的ORM、模板渲染、会话管理等特性。在使用Django的过程中,熟悉常用的Django运行命令可以让我们更加高效、便捷地…

    编程 2025-04-12
  • 使用django-ckeditor进行富文本编辑

    一、简介 Django-CKEditor是一个免费和开源的项目,它提供了一个基于Web的富文本编辑器,可以方便地进行长文本的编辑。它是基于在CKEditor之上的Django的一个…

    编程 2025-04-12
  • Django多线程实现指南

    一、多线程介绍 多线程是指在一个程序中同时执行多个线程,实现并发处理的技术。在Django开发中,如果使用多线程可以大大提高程序处理效率,让用户得到更好的体验。但是,多线程也带来了…

    编程 2025-02-05
  • Django配置MySQL

    一、安装Python和Django 首先,安装Python和Django是配置MySQL的前提条件。可以在https://www.python.org/downloads/下载Py…

    编程 2025-02-05
  • 深入学习Django中的objects.filter

    一、objects.filter介绍 Django为我们提供了方便的数据库查询API,其中objects.filter是其中非常常用的一种方式。filter()方法可以帮助我们从数…

    编程 2025-02-05

发表回复

登录后才能评论