django模型有两个通用(content_type)外键?

时间:2009-05-28 10:56:50

标签: django django-models generics

我正在尝试在两个通用(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'。添加一个   related_name参数   的定义   'resource_content_type'。

与代理商相似。

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

欢呼

菲尔

1 个答案:

答案 0 :(得分:10)

您是否尝试过执行错误消息要求您执行的操作 - 添加related_name参数?

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

编辑: 它发生的原因是每次定义外键时,Django会自动为目标模型提供一个属性来进行反向查找。默认情况下,它会为此提供相关表格的名称+ '_set' - 因此,如果您的article表格的FK为sectionsection将获得article_set反向查找的属性。

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