1. ホーム
  2. python

[解決済み] Django なぜいくつかのモデルフィールドは互いに衝突するのですか?

2022-04-21 08:38:45

質問

ユーザーへのリンクを2つ持つオブジェクトを作りたい。例えば

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引数を追加してください。

なぜエラーが出るのか、どうすれば直るのか、説明してください。

解決方法を教えてください。

Userに対する外部キーが2つあります。Django は自動的に User から GameClaim に戻る逆リレーションを作成しますが、これは通常 gameclaim_set . しかし、2つのFKを持っているので、2つのFKを持つことになります。 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()