Skip to main content
 首页 » 编程设计

python之获取对象的外键父级之Django

2025年05月04日21lautakyan007

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

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

在一个 View 中,我选择了某个 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) 

我如何使它起作用? 非常感谢任何帮助!

请您参考如下方法:

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 
    ...