2009-01-24 27 views
0

我有一個模型Foo,它具有用戶模型的ForeignKey。獲取外鍵而無需請求整個對象

後來,我需要抓住所有的用戶的ID,並把然後在列表上

foos = Foo.objects.filter(...) 

l = [ f.user.id for f in foos ] 

但是,當我這樣做,Django的抓住從DB整體用戶實例,而不是給我的只是數字用戶id,它存在於每個Foo行中。

如何在不查詢每個用戶或使用select_related的情況下獲取所有ID?

感謝

回答

5

使用queryset's values() function,這將返回

>>> Foo.objects.all().values('user__id') 
[{'user__id': 1}, {'user__id' 2}, {'user__id': 3}] 

的ORM然後將能夠在SQL查詢優化以僅返回所需的字段,而不是:包含名稱/值對作爲參數傳遞的每個屬性的字典列表做一個「SELECT *」。

+0

丹尼爾你好, 你的回答將幫助我的未來。謝謝! – Tiago 2009-01-25 14:55:26

0

沒關係......我不確定爲什麼當我試圖在此之前didn't的工作,但是這是如何做到:

l = [ f.user_id for f in foos ] 
3

無論何時在Django中定義一個ForeignKey,它都會自動爲您的模型添加FIELD_id字段。

例如,如果Foo有FK到User名爲「user」,屬性,那麼你也有一個名爲屬性user_id說明其中包含了相關用戶的ID。

l = [ f.user_id for f in foos ] 

調用.values()還增加了性能,如果您選擇的屬性明智