如何在Django中以反向名称='+'访问字段?

时间:2018-10-10 15:00:41

标签: django

如何定义另一个对象与该对象的反向关系,并以“ +”作为其相关名称?

class FeaturedContentPage(Page):
    featured_page = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+',
    )

2 个答案:

答案 0 :(得分:1)

related_name结尾的'+' *的想法是禁止创建反向关系,就像documented一样:

  

如果您希望Django 不创建向后关系,请将related_name设置为'+'或以'+'结尾。

您当然仍然可以使用以下方式反向查询:

FeaturedContentPage.objects.filter(featured_page=my_page)

但是没有反向关系,因此my_page.featuredcontentpage_set是不可访问的。

答案 1 :(得分:1)

related_name参数用于反向关系名称。如果模型有2个字段引用同一模型

featured_page = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+',
    )
regular_page = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+',
    )

没有related_name='+'的django将抱怨,因为它使用wagtailcore.Page模型名称进行反向关联。因为通过将related_name='+'设置为一个或两个字段,对象中的两个属性不能具有相同的名称,否则将忽略创建反向关系。