2012-05-22 143 views
25

我有一個嗅探所以找不到這個,但我相信它在這裏的某個地方。對於這個潛在的雙重職位道歉!Django - 如何從模型中選擇特定列?

如果我有這樣的代碼:

return Story.objects.filter(user=request.user.id).order_by('-create_date') 

,說故事,嗯,一個「說明」字段,我只是希望這樣描述現場,沒有必要爲DB送別的回與我的結果,我如何限制查詢只是

也就是說,我怎麼生成這個SQL:

select description from story where user_id = x order by create_date desc 

(其中x是當然的request.user.id值)

+0

的可能的複製[如何限制由Django的查詢返回的列?(http://stackoverflow.com/questions/2448978/how-to-limit-columns-returned-by-django-query) –

回答

37

使用values()values_list()

如果使用values(),你會擁有一個字典列表(技術上ValuesQuerySet

instance = MyModel.objects.values('description')[0] 
description = instance['description'] 

如果使用values_list(),你會用一個元組列表結束

instance = MyModel.objects.values_list('description')[0] 
description = instance[0] 

或者如果您剛剛獲得一個像這種情況下的值,則可以使用flat=True kwarg與values_list以獲取一個簡單的值列表

description = MyModel.objects.values_list('description', flat=True)[0] 
+5

正確:'return Story.objects.filter(user = request.user.id).order_by(' - create_date')。values('description')' – Furbeenator

+3

@bharal很多時候我發現一個值列表比較有用元組列表。您可以將'flat = True'傳遞給'values_list'以獲取值列表 – dm03514

+0

感謝所有,這正是我需要的 – bharal

3

使用only method。請閱讀文檔

+0

這實際上從我剛剛閱讀的文檔中發回'pk'以及 – okm

+1

um, ()方法(和它的表親,只有(),下面)僅適用於高級用例。當您仔細分析您的查詢並準確理解您需要的信息並且測量出您需要的字段和模型的全部字段之間的差異會很大時,它們會提供優化。 – bharal

1

正如文檔所述,如果您的查詢集只會產生一個對象,建議您應該使用get()而不是過濾器。從你給出的名字,我會假設每個用戶的user_id都是不同的。編輯1:我剛剛接受了orderby子句的通知。所以我建議如果user_id不同或使用pk,則使用此代碼。

description = story.objects.filter('description').get(user_id=x)