28

给定以下具有两个多对多关系的模型:

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

美好的; 我不需要反向关系。根据相关名称的 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

我认为您只需要为这两个字段提供不同的相关名称:

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。如果您提供相同的相关名称,它将再次尝试创建相同的访问器两次,因此您需要提供唯一的相关名称。用上面的代码定义你的模型,然后给定一个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+")
于 2012-12-17T17:41:30.103 回答
19

你还没有仔细阅读 Django 的文档。这里说:

如果您有多个指向同一模型的 ManyToManyField 并希望抑制向后关系,请将每个 related_name 设置为以“+”结尾的唯一值。

related_name属性必须是唯一的,而不是相同的。

于 2012-12-17T17:44:50.180 回答