2つの多対多の関係を持つ次のモデルがあるとします。
class Child(models.Model):
name = models.CharField(max_length=80)
class Foo(models.Model):
bar = models.ManyToManyField(Child)
baz = models.ManyToManyField(Child)
これはエラーになります:
accounts.foo: Accessor for m2m field 'bar' clashes with related m2m field 'Child.foo_set'. Add a related_name argument to the definition for 'bar'.
accounts.foo: Accessor for m2m field 'baz' clashes with related m2m field 'Child.foo_set'. Add a related_name argument to the definition for 'baz'.
いいよ 後方関係は必要ありません。related_nameのDjangoドキュメント(これは、私の知る限り、ForeignKeyの下のみにあります)によると、設定できrelated_name="+"
、後方関係は作成されません。
class Child(models.Model):
name = models.CharField(max_length=80)
class Foo(models.Model):
bar = models.ManyToManyField(Child, related_name="+")
baz = models.ManyToManyField(Child, related_name="+")
ただし、これは機能しません。
accounts.foo: Accessor for m2m field 'bar' clashes with related m2m field 'Child.+'. Add a related_name argument to the definition for 'bar'.
accounts.foo: Reverse query name for m2m field 'bar' clashes with related m2m field 'Child.+'. Add a related_name argument to the definition for 'bar'.
accounts.foo: Accessor for m2m field 'baz' clashes with related m2m field 'Child.+'. Add a related_name argument to the definition for 'baz'.
accounts.foo: Reverse query name for m2m field 'baz' clashes with related m2m field 'Child.+'. Add a related_name argument to the definition for 'baz'.
リバースリレーションを作成しないようにするにはどうすればよいですか?
2つのフィールドに異なるrelated_namesを指定するだけでよいと思います。
class Child(models.Model):
name = models.CharField(max_length=80)
class Foo(models.Model):
bar = models.ManyToManyField(Child, related_name="bar")
baz = models.ManyToManyField(Child, related_name="baz")
関連する名前を付けない場合foo_set
、Child
モデルに同じアクセサー名()を2回作成しようとしています。同じ関連名を付けると、同じアクセサーを2回作成しようとするため、一意の関連名を付ける必要があります。上記のコードでモデルを定義し、Child
インスタンスを指定すると、およびでc
関連Foo
オブジェクトにアクセスできます。c.bar.all()
c.baz.all()
後方関係が必要ない場合+
は、(一意の)関連する名前のそれぞれにa を追加します。
class Foo(models.Model):
bar = models.ManyToManyField(Child, related_name="bar+")
baz = models.ManyToManyField(Child, related_name="baz+")
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加