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

时间:2011-07-28 15:52:18

标签: python django

我对Django很新,似乎有一种简单而明显的方法可以做到这一点,但如果是这样的话我就找不到了。

(略微简化的代码)

我有一个小学班

class Article(models.Model):
    ...

和二级课程

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

是否有一种简单的方法可以获取headline对象的Article属性(或者更确切地说,获取与该对象关联的所有headline个对象的Headline属性Article对象)?我知道可以通过Headline属性过滤article个对象,但我怀疑有更快更简单的方法。是否可以向类Article添加一个方法,例如,它将返回所有关联的Headline个对象?

3 个答案:

答案 0 :(得分:5)

如果您有Article的单个实例,则可以使用

获取所有标题对象
article.headline_set.all()

这将返回一个可以像其他任何一样使用的QuerySet。

编辑:如果您想获得实际的标题值,那么就像任何其他查询集一样,您需要获得Headline的单个实例。例如,

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

Edit2:正如Thibault J在评论中指出的那样,你可以获得所有头条新闻

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

答案 1 :(得分:3)

获取所有实际标题的更好方法是使用values_list

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

这样只会实际请求headline字段,从而减少对数据库的命中。

答案 2 :(得分: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所述。