2011-10-18 37 views

回答

74

使用.values()方法:

>>> Blog.objects.values() 
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}], 
>>> Blog.objects.values('id', 'name') 
[{'id': 1, 'name': 'Beatles Blog'}] 

注:結果是QuerySet它很像一個列表,但實際上不是的list一個實例。如果您確實需要list的實例,請使用list(Blog.objects.values(…))

+4

是的,你可以通過傳遞參數來指定你希望'values()'返回哪些字段。還要小心,雖然它看起來像值返回一個字典列表其實它是一個''而不是一個列表。 – dm03514

+1

雖然 – astreltsov

+0

實際上並未返回列表謝謝!更新。 –

2

您不完全定義字典應該是什麼樣子,但很可能您指的是QuerySet.values()。從official django documentation

返回ValuesQuerySet - 一個QuerySet子類作爲可迭代使用時,而不是模型實例 對象返回 字典。

這些字典中的每一個都代表一個對象,其中鍵 對應於模型對象的屬性名稱。

14

.values()方法將返回ValuesQuerySet類型的結果通常是你在大多數情況下需要什麼。

但是,如果您願意,可以使用Python列表理解將ValuesQuerySet轉換爲本機Python列表,如下例所示。

result = Blog.objects.values()    # return ValuesQuerySet object 
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list 
return list_result 

我發現上面的幫助,如果你正在編寫單元測試,並需要斷言函數的預期收益值,實際的返回值匹配,在這種情況下,兩個expected_resultactual_result必須是同一類型的(例如字典)。

actual_result = some_function() 
expected_result = { 
    # dictionary content here ... 
} 
assert expected_result == actual_result 
+5

或者你可以用這個'list(result) –

0

您可以使用您從您作出的查詢的Django模型領域得到了字典的values()方法,然後你可以很容易地通過一個索引值來訪問每個字段。

這樣稱呼它 -

myList = dictOfSomeData.values() 
itemNumberThree = myList[2] #If there's a value in that index off course... 
2

如果需要本地數據類型出於某種原因(如JSON序列化),這是我的快速「N」骯髒的方式做到這一點:

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs] 

正如你所看到的那樣,構建列表中的字典並不真正幹,所以如果有人知道更好的方法...