2013-04-03 85 views
1

假設我有兩個模式是這樣的:獲取對象的外鍵父 - Django的

class Article(models.Model): 
    article_title = models.CharField(max_length=100) 

class EventRecord(models.Model): 
    article = models.ForeignKey(Article) 

在視圖中,我選擇了一定EventRecord並要顯示的文章是涉及到還有的標題。以下不工作:

def classify(request, pk): 
    event = get_object_or_404(EventRecord, pk=pk) 
    article_id = event.article 
    article = get_object_or_404(Article, pk=article_id) 

如何使這項工作? 任何幫助是真的讚賞!

回答

6

的Django自動爲您處理此。例如:

>>> record = EventRecord.objects.get(...) 
>>> isinstance(record.article, Article) 
True 
>>> record.article.article_title 
u'title here' 

這是神奇的東西Django的做(沒有什麼是魔法但無論如何...)之一。請記住,爲了這項工作,Django通常會執行一些額外的數據庫查詢。要消除它們,您可以使用select_related方法。下面是一個消除額外查詢,並做你想要的片段:

def classify(request, pk): 
    record = EventRecord.objects.filter(pk=pk).select_related() 

    # the above returns queryset hence you have to extract the record manually 
    if not len(record): 
     raise Http404() 
    else: 
     record = record[0] 

    # now use record as usual and no extra queries will be executed 
    title = record.article.article_title 
    ... 
2

event.article返回實際的Article對象,而不是主鍵,因此您不需要執行另一個數據庫查詢。

def classify(request, pk): 
    event = get_object_or_404(EventRecord, pk=pk) 
    if not event.article: 
     raise Http404 
    print event.article.article_title 
+0

真棒,謝謝! :) – LukasKawerau 2013-04-03 21:48:45

+0

'if not event.article'不是必須的,因爲'EventRecord'中的'article'字段不能爲空,因此'article'將始終存在。 – miki725 2013-04-03 21:57:08