本文介绍 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,)]>
相关用法
- Python Django QuerySet.values用法及代码示例
- Python Django QuerySet.select_related用法及代码示例
- Python Django QuerySet.union用法及代码示例
- Python Django QuerySet.latest用法及代码示例
- Python Django QuerySet.intersection用法及代码示例
- Python Django QuerySet.get用法及代码示例
- Python Django QuerySet.none用法及代码示例
- Python Django QuerySet.exclude用法及代码示例
- Python Django QuerySet.get_or_create用法及代码示例
- Python Django QuerySet.update_or_create用法及代码示例
- Python Django QuerySet.prefetch_related用法及代码示例
- Python Django QuerySet.first用法及代码示例
- Python Django QuerySet.annotate用法及代码示例
- Python Django QuerySet.dates用法及代码示例
- Python Django QuerySet.select_for_update用法及代码示例
- Python Django QuerySet.order_by用法及代码示例
- Python Django QuerySet.bulk_update用法及代码示例
- Python Django QuerySet.in_bulk用法及代码示例
- Python Django QuerySet.defer用法及代码示例
- Python Django QuerySet.aggregate用法及代码示例
- Python Django QuerySet.reverse用法及代码示例
- Python Django QuerySet.count用法及代码示例
- Python Django QuerySet.exists用法及代码示例
- Python Django QuerySet.explain用法及代码示例
- Python Django QuerySet.create用法及代码示例
注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.query.QuerySet.values_list。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。