如何在父对象中获取子属性
我刚接触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
这个字段。