2013-04-03 62 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