1

假设我有两个这样的模型:

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)

我该如何进行这项工作?非常感谢任何帮助!

4

2 回答 2

14

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
    ...
于 2013-04-03T21:51:56.720 回答
3

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
于 2013-04-03T21:46:39.890 回答