假设我有两个这样的模型:
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)
如何使这项工作? 任何帮助真的赞赏!
答案 0 :(得分:7)
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
...
答案 1 :(得分: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