我正在尝试在两个通用(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'。
与代理商相似。
这里发生了什么?我该怎么办?
欢呼菲尔
答案 0 :(得分:10)
您是否尝试过执行错误消息要求您执行的操作 - 添加related_name参数?
agent_content_type = models.ForeignKey(ContentType, related_name='mymodel_agent')
编辑:
它发生的原因是每次定义外键时,Django会自动为目标模型提供一个属性来进行反向查找。默认情况下,它会为此提供相关表格的名称+ '_set'
- 因此,如果您的article
表格的FK为section
,section
将获得article_set
反向查找的属性。
现在,如果同一模型中有两个FK指向同一个目标模型,Django会尝试将两个 foo_set
属性赋予它们,从而导致冲突。因此,错误消息告诉您手动设置related_name属性。