2012-03-15 81 views
34

我想知道的等效有什麼等價於:Django的: 「選擇[列名]從[表名]」

select columnname from tablename 

像Django的教程說:

Entry.objects.filter(condition) 

獲取所有具有給定條件的對象。它是這樣的:

select * from Entry where condition 

但我想列出只有一列[在我的情況是一個外鍵]。發現:

Entry.objects.values_list('column_name', flat=True).filter(condition) 

也是這樣。但在我的情況下,該列是一個外鍵,並且該查詢失去了外鍵的屬性。它只是存儲值。我無法查找電話。

+1

我開始寫一個答案,現在我不確定。你想讓django從外鍵中返回一個對象,還是你想要這個鍵本身? – 2012-03-15 19:37:11

回答

51

當然,valuesvalue_list將從數據庫中檢索原始值。 Django無法在模型上使用它的「魔術」,這意味着您無法遍歷關係,因爲您堅持使用外鍵指向的id而不是ForeignKey字段。

如果需要過濾這些值,你可以做以下(假設column_name是指向MyModel一個ForeignKey):

ids = Entry.objects.values_list('column_name', flat=True).filter(...) 
my_models = MyModel.objects.filter(pk__in=set(ids)) 

下面是values_list()

+1

這可能工作,但如果它是我我不喜歡必須對數據庫進行兩次調用。 @Gareth Rees有一個更好的方法 - 翻轉查詢並從所需對象的角度編寫它,並利用related_name – ThatAintWorking 2012-03-16 13:27:46

5

將查詢限制設置爲特定的列(S)使用.values(columname)

你也應該可能添加不同到最後,所以你的查詢將端:

Entry.objects.filter(myfilter).values(columname).distinct() 

請參閱:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values

瞭解更多信息

根據在評論你的答案,我會回來和編輯。

編輯:

我不能肯定,如果方法是正確的,但。您可以通過獲取通過過濾器正常的查詢集,然後做得到所有在Python列表中的對象:

myobjectlist = map(lambda x: x.mycolumnname, myqueryset) 

用這種方法唯一的問題是,如果你的查詢集大內存的使用將是同樣大。

無論如何,我仍然不確定問題的一些具體問題。

+2

values()給values_list()提供了類似的結果。我得到'用戶'列值爲1L,2L ...但外鍵關係丟失。我無法訪問'用戶'類。 – Anuj 2012-03-15 19:57:50

+0

你需要'order_by'以使'distinct'完成它的工作。 – 2012-03-15 21:45:40

+0

類似的,同樣非優雅的解決方案獲取物品,而不是ID的是: [instance.member例如在Entry.filter(條件).distinct('成員')] – Nimo 2013-05-20 07:56:26

9

你有一個模型A與文檔一個到另一個型號B的外鍵,並且您想要選擇某些A所指的B。是對的嗎?如果是這樣,你要查詢的只是:

B.objects.filter(a__isnull = False) 

如果你有相應的A條件,那麼查詢可以是:

B.objects.filter(a__field1 = value1, a__field2 = value2, ...) 

對於爲什麼這個作品的說明,請參見Django's backwards relation documentation,和ForeignKey.related_name option如果你想改變向後關係的名字。

+0

我認爲這是更好的方法,但您應該提及使用related_name – ThatAintWorking 2012-03-16 13:29:46

+2

@Ron:我添加了文檔的鏈接。 – 2012-03-16 14:11:03