28

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'.

逆の関係を作成しないようにするにはどうすればよいですか?

4

2 に答える 2

45

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、モデルで同じアクセサー名 ( ) を 2 回作成しようとしていますChild。同じ関連名を指定すると、同じアクセサーを 2 回作成しようとするため、固有の関連名を指定する必要があります。モデルを定義する上記のコードを使用すると、Childinstanceが与えられ、関連するオブジェクトにおよびでcアクセスできます。Fooc.bar.all()c.baz.all()

後方関係が必要ない場合+は、(一意の) 関連名のそれぞれに a を追加します。

class Foo(models.Model):
  bar = models.ManyToManyField(Child, related_name="bar+")
  baz = models.ManyToManyField(Child, related_name="baz+")
于 2012-12-17T17:41:30.103 に答える
19

あなたは Django のドキュメントを十分に注意深く読んでいません。ここでは次のように述べています。

同じモデルを指している複数の ManyToManyField があり、後方関係を抑制したい場合は、各 related_name を「+」で終わる一意の値に設定します。

related_name属性は、同じではなく、一意である必要があります。

于 2012-12-17T17:44:50.180 に答える