如何在父对象中获取子属性

5 投票
3 回答
4034 浏览
提问于 2025-04-16 22:27

我刚接触Django,感觉这个问题可能有简单明了的解决办法,但我找不到。

(稍微简化了一下代码)

我有一个主要的类

class Article(models.Model):
    ...

还有一个次要的类

class Headline(models.Model):
    article = models.ForeignKey(Article)
    headline = models.CharField(max_length=200)

有没有简单的方法可以获取一个Article对象的headline属性(或者说,获取所有与这个Article对象关联的Headline对象的headline属性)?我知道可以通过article属性来筛选Headline对象,但我觉得可能有更快更简单的方法。比如,能不能给Article类添加一个方法,直接返回所有关联的Headline对象?

3 个回答

1

你可以设置一个叫做 related_name 的属性,这样就可以用这个名字来访问文章的标题。

class Article(models.Model):
    pass

class Headline(models.Model):
    article = models.ForeignKey(Article, related_name='headlines')

a = Article.objects.all()[0]
print a.headlines.all()

如果不设置的话,默认的名字会是 headline_set,这是 murgatroid99 提到的。

5

如果你有一个单独的 Article 实例,那么你可以通过下面的方式获取所有的标题对象:

article.headline_set.all()

这个操作会返回一个查询集,你可以像使用其他查询集一样使用它。

补充:如果你想获取实际的标题内容,那么就像处理其他查询集一样,你需要获取一个单独的 Headline 实例。例如:

headline = article.headline_set.all()[0].headline

补充2:正如 Thibault J 在评论中提到的,你可以通过下面的方式获取所有的标题:

headlines = [headline.headline for headline in article.headlines.all()]
4

获取所有真实标题的一个更好的方法是使用 values_list:

article.headline_set.values_list('headline', flat=True)

这样做可以减少对数据库的请求,因为它只会真正请求 headline 这个字段。

撰写回答