Django双向关系

时间:2012-08-31 15:13:14

标签: django object-relationships

我正在建立一个博客网站,并提供有关类别和帖子的模型。帖子有类别的多对多关系。

class Post(models.Model):
     categories = models.ManyToManyField(Category)

除了在模板的类别列表中我只想加载实际有帖子的类别这一事实之外,一切都工作得很好。

如果一个类别是空的我不想显示它,我试图在Category to Post中定义一个关系,允许我使用像{{ if category.posts }}这样的东西。目前使用分类中的另一个多对多字段,目前在管理员中给了我一个额外的字段,我真的不想要或感觉不到需要。

如何最好地导航这种关系,或创建一个合适的关系?

干杯 千电子伏

2 个答案:

答案 0 :(得分:4)

Django会自动在任何ForeignKey或ManyToMany关系的相关模型上创建一个字段。您可以通过related_name选项控制相关模型上字段的名称,如下所示:

class Post(models.Model):
 categories = models.ManyToManyField(Category,related_name='posts')

这样,您的方法无需任何其他字段即可运行。顺便说一句,如果你省略了related_name参数,Django默认会创建一个[field_name] _set。

答案 1 :(得分:0)

您可以在reverse relations字段上使用ManyToMany。在反向过滤器中,必须使用相关的模型名称(如果未使用related_name属性)。因此,在您的问题中,您可以使用模型名称作为反向名称,如:

{% if category.post %}

您也可以在视图中的过滤功能中使用它:

Category.objects.filter(post__isnull=False)

反向关系名称必须小写。

查看文档here