在Django ORM中,`QuerySet`对象提供了多种方法来获取数据库中的数据。`values_list`和`values`是两种常用的方法,它们都用于获取查询结果的字典表示形式,但有一些关键的区别:

1. values_list

- 返回一个元组列表,其中每个元组代表一个数据库行。

- 每个元组中的元素顺序对应于传递给`values_list`的字段名列表。

- 如果查询结果为空,`values_list`返回一个空列表。

- 可以指定多个字段,但返回的是平铺的元组,而不是嵌套的。

2. values

- 返回一个字典列表,其中每个字典代表一个数据库行。

- 字典的键是字段名,值是对应的字段值。

- 如果查询结果为空,`values`返回一个空列表。

- 可以指定多个字段,返回的是每个字段名映射到其值的字典。

举例说明

假设我们有一个名为`Book`的模型,它有两个字段:`id`和`title`。

class Book(models.Model):

    id = models.AutoField(primary_key=True)

    title = models.CharField(max_length=100)

现在,我们想要从数据库中检索所有书籍的ID和标题。

使用`values_list`

book_ids_and_titles = Book.objects.values_list('id', 'title')

执行上述查询后,`book_ids_and_titles`将是一个元组列表,每个元组包含书籍的ID和标题。例如:

[

    (1, 'The Great Gatsby'),

    (2, '1984'),

    (3, 'To Kill a Mockingbird')

]

使用`values`

book_ids_and_titles = Book.objects.values('id', 'title')

执行这个查询后,`book_ids_and_titles`将是一个字典列表,每个字典包含书籍的ID和标题。例如:


[

    {'id': 1, 'title': 'The Great Gatsby'},

    {'id': 2, 'title': '1984'},

    {'id': 3, 'title': 'To Kill a Mockingbird'}

]

使用场景

- 如果你想要将这些数据传递给一个函数,该函数期望接收一个元组列表作为参数,那么`values_list`是合适的选择。例如,你可能有一个函数`print_books(book_list)`,它打印传入的书籍列表。

- 如果你需要在代码中根据字段名来访问字段值,那么`values`是更好的选择。例如,你可能想要根据书籍的标题来筛选书籍,然后对它们进行进一步的处理。

性能考虑

- values_list通常在不需要通过字段名来索引数据时更高效,因为它避免了创建字典的开销。

- values在需要频繁访问字段名时更方便,因为它直接提供了字段名到值的映射。

选择使用哪种方法取决于你的具体需求和性能考虑。