一、基础用法
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