Django:为何某些模型字段会冲突?

180 投票
6 回答
42000 浏览
提问于 2025-04-15 12:58

我想创建一个对象,这个对象里面有两个链接指向用户。比如说:

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 个回答

7

提问者并没有使用抽象基类……但如果你在使用的话,你会发现直接在外键(FK)中写死相关名称(比如,..., related_name="myname")会导致很多冲突错误——每个从基类继承的类都会出现一个这样的错误。下面提供的链接包含了解决方法,虽然简单,但绝对不是显而易见的。

来自Django文档的说明……

如果你在外键或多对多字段上使用了 related_name 属性,你必须始终为该字段指定一个唯一的反向名称。这通常会在抽象基类中造成问题,因为这个类中的字段会被包含到每个子类中,并且每次这些属性(包括 related_name)的值都是完全相同的。

更多信息请查看 这里

8

User模型试图创建两个同名的字段,一个是针对那些以该UsertargetGameClaims,另一个是针对以该UserclaimerGameClaims。这里有一份关于related_name文档,这是Django提供的一种方式,让你可以设置属性的名称,以避免自动生成的名称发生冲突。

301

你有两个外键指向用户(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()

撰写回答