【问题标题】:django model with two generic (content_type) foreign keys?具有两个通用(content_type)外键的 Django 模型?
【发布时间】:2010-10-29 13:09:50
【问题描述】:

我正在尝试在两个通用 (content_type) 引用之间创建一个映射表,一个用于“代理”,一个用于“资源”。

所以我采用通常的方式制作通用外键:

content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
resource = generic.GenericForeignKey('content_type', 'object_id')

我试着用两个做一个模型。

agent_content_type = models.ForeignKey(ContentType)
agent_object_id = models.PositiveIntegerField()
agent = generic.GenericForeignKey('agent_content_type', 'agent_object_id')

resource_content_type = models.ForeignKey(ContentType)
resource_object_id = models.PositiveIntegerField()
resource = generic.GenericForeignKey('resource_content_type', 'resource_object_id')

但这现在会引发以下错误:

myapp.mymodel:字段访问器 'resource_content_type' 与 相关领域 'ContentType.mymodel_set'。添加一个 相关名称参数 定义为 'resource_content_type'。

代理也类似。

这里发生了什么?我该怎么办?

干杯

菲尔

【问题讨论】:

    标签: django django-models generics


    【解决方案1】:

    您是否尝试过按照错误消息告诉您的操作 - 添加一个 related_name 参数?

    agent_content_type = models.ForeignKey(ContentType, related_name='mymodel_agent')
    

    编辑: 发生这种情况的原因是每次定义外键时,Django 都会自动给目标模型一个属性来进行反向查找。默认情况下,它会给出相关表的名称 + '_set' - 因此,如果您的 article 表具有到 section 的 FK,section 将获得用于反向查找的 article_set 属性。

    现在,如果您在同一个模型中有两个 FK 指向同一个目标模型,Django 将尝试为它们 both 赋予foo_set 属性,从而导致冲突。因此出现错误消息,告诉您手动设置related_name 属性。

    【讨论】:

    • 谢谢,这行得通。但我希望有人能解释原因。或者更确切地说,当我有两个通用外键但没有一个时,为什么会出现歧义?
    • 编辑添加解释。
    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 2014-12-24
    • 2012-03-16
    • 2015-12-21
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多