详解Django的 values_list() 函数:获取指定字段的列表

  • Post category:Python

1. 作用与使用方法

Django的values_list()函数是QuerySet对象的一个方法,其作用是以元组的形式返回QuerySet中若干字段的值,可以用于生成一些简单的报表或者用于序列化JSON数据。values_list()函数的用法如下:

values_list(*fields, flat=False)

其中,fields参数指定需要返回的字段列表,可以是一个具体的字段值,也可以是通过一个列表包含多个字段值。flat参数决定返回的结果是否是一个平铺的一维列表。如果指定flat=True,则values_list()函数返回的结果是一个一维列表,否则返回的是一个二维元组。

2. 实例说明

示例一

例如,有一个名为Author的模型,包含有名字、国籍等字段,需要查询作者的名字和国籍。那么可以使用values_list()函数来实现这一需求。具体的代码如下:

from myapp.models import Author

authors = Author.objects.all().values_list('name', 'country')
for author in authors:
    print(author)

实际上,上面的代码等效于下面使用values()函数的代码:

authors = Author.objects.all().values('name', 'country')
for author in authors:
    print((author['name'], author['country']))

示例二

再比如,有一个名为Book的模型,包含有书名、作者和出版日期等字段,需要查询作者、出版日期和书名,然后将结果导出为CSV文件。代码实现如下:

import csv
from myapp.models import Book
from django.http import HttpResponse

def export_books_csv(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="books.csv"'
    writer = csv.writer(response)

    books = Book.objects.values_list('author__name', 'published_date', 'title')

    writer.writerow(['Author', 'Published date', 'Title'])
    for book in books:
        writer.writerow(book)

    return response

其中,Book.objects.values_list('author__name', 'published_date', 'title')查询了所有图书的作者、出版日期和书名字段;writer.writerow(book)则将每本书的这些字段写入CSV文件。该函数会下载一个名为books.csv的CSV文件。