【问题标题】:Django Two Way relationshipDjango 双向关系
【发布时间】:2012-08-26 10:29:18
【问题描述】:

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

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

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

如果类别为空,我不想显示它,我尝试在类别中定义与帖子的关系,以允许我使用类似{{ if category.posts }} 的内容。目前,在 Category 中使用另一个 Many to Many 字段正在给我一个额外的 admin 字段,我并不真正想要或觉得不需要。

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

干杯 凯夫

【问题讨论】:

    标签: django object-relationships


    【解决方案1】:

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

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

    这样,您的方法无需任何附加字段即可工作。顺便说一句,如果你省略了 related_name 参数,Django 将默认创建一个带有 [field_name]_set 的参数。

    【讨论】:

      【解决方案2】:

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

      {% if category.post %}
      

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

      Category.objects.filter(post__isnull=False)
      

      反向关系名称必须小写。

      查看文档here

      【讨论】:

        猜你喜欢
        • 2020-05-03
        • 2013-04-05
        • 2016-12-05
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        相关资源
        最近更新 更多