當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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