int*_*tar 5 generics django django-models
我正在尝试在两个通用(content_type)引用之间创建一个映射表,一个用于"代理",一个用于"资源".
所以我采用通常的方式制作通用外键:
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
resource = generic.GenericForeignKey('content_type', 'object_id')
Run Code Online (Sandbox Code Playgroud)
我尝试用两个模型制作模型.
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')
Run Code Online (Sandbox Code Playgroud)
但是这会引发以下错误:
myapp.mymodel:字段'resource_content_type'的访问者与相关字段'ContentType.mymodel_set'冲突.将related_name参数添加到"resource_content_type"的定义中.
和代理商类似.
这里发生了什么?我该怎么办?
干杯
菲尔
Dan*_*man 10
您是否尝试过执行错误消息告诉您的操作 - 添加related_name参数?
agent_content_type = models.ForeignKey(ContentType, related_name='mymodel_agent')
Run Code Online (Sandbox Code Playgroud)
编辑:它发生的原因是每次定义外键时,Django会自动为目标模型提供一个属性来进行反向查找.默认情况下,它为此提供相关表的名称+ '_set'- 因此,如果您的article表具有FK section,section则将获得article_set反向查找的属性.
现在,如果你在同一个模型指向2个FKS在同一目标模型,Django会尝试给他们两个的foo_set属性,从而导致冲突.因此,错误消息告诉您手动设置related_name属性.