Django:为何某些模型字段会冲突?
我想创建一个对象,这个对象里面有两个链接指向用户。比如说:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
但是当我运行服务器的时候,出现了以下错误:
字段 'target' 的访问器和相关字段 'User.gameclaim_set' 冲突。请在 'target' 的定义中添加一个 related_name 参数。
字段 'claimer' 的访问器和相关字段 'User.gameclaim_set' 冲突。请在 'claimer' 的定义中添加一个 related_name 参数。
你能解释一下为什么会出现这些错误,以及如何解决它们吗?
6 个回答
提问者并没有使用抽象基类……但如果你在使用的话,你会发现直接在外键(FK)中写死相关名称(比如,..., related_name="myname")会导致很多冲突错误——每个从基类继承的类都会出现一个这样的错误。下面提供的链接包含了解决方法,虽然简单,但绝对不是显而易见的。
来自Django文档的说明……
如果你在外键或多对多字段上使用了 related_name 属性,你必须始终为该字段指定一个唯一的反向名称。这通常会在抽象基类中造成问题,因为这个类中的字段会被包含到每个子类中,并且每次这些属性(包括 related_name)的值都是完全相同的。
更多信息请查看 这里。
User
模型试图创建两个同名的字段,一个是针对那些以该User
为target
的GameClaims
,另一个是针对以该User
为claimer
的GameClaims
。这里有一份关于related_name
的文档,这是Django提供的一种方式,让你可以设置属性的名称,以避免自动生成的名称发生冲突。
你有两个外键指向用户(User)。Django会自动从用户那边创建一个反向关系,通常这个关系叫做gameclaim_set
。但是因为你有两个外键,所以会有两个gameclaim_set
属性,这显然是不行的。因此,你需要告诉Django应该用什么名字来表示这个反向关系。
你可以在外键的定义中使用related_name
属性来指定名字。例如:
class GameClaim(models.Model):
target = models.ForeignKey(User, related_name='gameclaim_targets')
claimer = models.ForeignKey(User, related_name='gameclaim_users')
isAccepted = models.BooleanField()