本文介紹 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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。