当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django QuerySet.values_list用法及代码示例


本文介绍 django.db.models.query.QuerySet.values_list 的用法。

声明

values_list(*fields, flat=False, named=False)

这类似于values(),只是它不是返回字典,而是在迭代时返回元组。每个元组都包含传递给values_list()调用的各个字段或表达式的值——所以第一项是第一个字段,等等。例如:

>>> Entry.objects.values_list('id', 'headline')
<QuerySet [(1, 'First entry'), ...]>
>>> from django.db.models.functions import Lower
>>> Entry.objects.values_list('id', Lower('headline'))
<QuerySet [(1, 'first entry'), ...]>

如果只传入单个字段,也可以传入flat 参数。如果 True ,这将意味着返回的结果是单个值,而不是 one-tuples。一个例子应该使差异更清楚:

>>> Entry.objects.values_list('id').order_by('id')
<QuerySet[(1,), (2,), (3,), ...]>

>>> Entry.objects.values_list('id', flat=True).order_by('id')
<QuerySet [1, 2, 3, ...]>

当有多个字段时,传入flat 是错误的。

您可以传递 named=True 以获取结果为 namedtuple()

>>> Entry.objects.values_list('id', 'headline', named=True)
<QuerySet [Row(id=1, headline='First entry'), ...]>

使用命名元组可以使结果更具可读性,但代价是将结果转换为命名元组的性能损失很小。

如果您不向 values_list() 传递任何值,它将按照声明的顺序返回模型中的所有字段。

一个常见的需求是获取某个模型实例的特定字段值。为此,请使用 values_list() 后跟 get() 调用:

>>> Entry.objects.values_list('headline', flat=True).get(pk=1)
'First entry'

values()values_list() 都旨在作为特定用例的优化:检索数据子集而无需创建模型实例的开销。这个比喻在处理多对多和其他多值关系(例如反向外键的一对多关系)时分崩离析,因为“一行,一个对象”假设不成立。

例如,请注意跨 ManyToManyField 查询时的行为:

>>> Author.objects.values_list('name', 'entry__headline')
<QuerySet [('Noam Chomsky', 'Impressions of Gaza'),
 ('George Orwell', 'Why Socialists Do Not Believe in Fun'),
 ('George Orwell', 'In Defence of English Cooking'),
 ('Don Quixote', None)]>

有多个条目的作者多次出现,没有任何条目的作者的条目标题为None

同样,当查询反向外键时,None 会出现在没有任何作者的条目中:

>>> Entry.objects.values_list('authors')
<QuerySet [('Noam Chomsky',), ('George Orwell',), (None,)]>

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.query.QuerySet.values_list。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。