2011-07-28 54 views
4

我對Django相當陌生,似乎可能有一個簡單而明顯的方法來做到這一點,但如果是這樣,我一直無法找到它。如何在父對象中獲取子屬性

(略微簡化的代碼)

我有一個主類

class Article(models.Model): 
    ... 

和次級類

class Headline(models.Model): 
    article = models.ForeignKey(Article) 
    headline = models.CharField(max_length=200) 

有一種簡單的方式來獲得一個Article對象的headline屬性(或者說,要獲得與Article關聯的所有Headline對象的headline屬性目的)?我知道有可能通過article屬性過濾Headline對象,但我懷疑有一種更快更簡單的方法。例如,是否可以向類Article添加一個方法,以返回所有關聯的Headline對象?

+1

您是否在查找本頁面的文檔? https://docs.djangoproject.com/en/1.3/topics/db/queries/#following-relationships-backward –

回答

3

一個更好的方式來獲得所有實際的頭條新聞是使用values_list

article.headline_set.values_list('headline', flat=True) 

這僅實際上需要爲headline領域減少對數據庫的打擊。

+0

謝謝,這正是我需要的! – stillLearning

5

如果你有Article一個實例,那麼你就可以得到所有的標題對象與

article.headline_set.all() 

這會返回一個QuerySet,你可以使用,就像任何其他。

編輯:如果你想獲得實際的標題值,那麼就像其他任何查詢集一樣,你將需要得到一個Headline的單個實例。例如,

headline = article.headline_set.all()[0].headline 

EDIT2:作爲蒂博法官在評論中指出,你可以得到所有的頭條新聞與

headlines = [headline.headline for headline in article.headlines.all()] 
+0

'headlines = [headline.headline for headline in article.headlines.all()]'應該可以得到所有的頭條新聞。 –

+0

好的,我會添加到我的答案。 – murgatroid99

1

您可以指定related_name屬性設置屬性名用於訪問文章標題。

class Article(models.Model): 
    pass 

class Headline(models.Model): 
    article = models.ForeignKey(Article, related_name='headlines') 

a = Article.objects.all()[0] 
print a.headlines.all() 

否則,默認屬性名稱將是headline_set,由murgatroid99說。

+0

這確實有效,但它返回一組標題對象,當我需要的是實際的'headline',它是類標題的屬性。 – stillLearning

+0

我添加了'headline'值給我的答案。 – murgatroid99