该模型通过中间模型具有两个多对多关系



我有一个模型,它有两个独立的ManyToManyField关系,返回到

class Company(models.Model):
parent          =     models.ManyToManyField("self", through='CompanyParent', through_fields=('company_child', 'company_parent'), related_name='+')
child           =     models.ManyToManyField("self", through='CompanyParent', through_fields=('company_parent', 'company_child'), related_name='+')

以上内容在我的localhost Django v3.0.2/SQLite 3.8.7.2 上运行良好

为了真正发布它,我不得不使用Django v2.1.15/SQLite 3.7.17,但在发布的版本中,它消除了以下错误

companies.child:(fields.E332(多对多字段中间表不能对称。

companies.Company.parent:(fields.E332(具有中间表不能对称。

公司:(型号.E003(该型号有两个多对多通过中间模型"company.CompanyParent".建立关系

这里发生了什么?通过向每个模型添加symmetrical=False解决了前两个问题,但不知道如何解决最终错误?

您可以检查这个答案来设置两个多对多关系。

上述答案中的一个例子:

class Person(models.Model): 
name = models.CharField(max_length=127, blank=False)
to_users = models.ManyToManyField(
'self', 
symmetrical=False, 
related_name='from_users',
through='Event', 
through_fields=('from_user', 'to_user'),
)
class Event(models.Model):
item = models.ForeignKey(Item, related_name='events')
from_user = models.ForeignKey(Person, related_name='events_as_giver')
to_user = models.ForeignKey(Person, related_name='events_as_receiver')

如果有人遇到同一问题;以上是答案,但我认为在对我自己的项目进行必要的更改后,我会稍微扩展一下

如果你希望在同一个模型中有很多多对多,如果你使用的是2.2a1之后的Django版本,那么最好的方法是我的问题中详细介绍的方法;两个不同的模型,您可以很容易地调用视图或模板;例如

> data.manytomany1
> data.manytomany2

但是,在2.2a1之前,您将遇到问题。对我来说,这是因为在cPanel上,由于使用了旧的SQLite 3.7.17,我不得不使用Django v2.1.15。这意味着你只能有一个ManyToManyField(见上文(,并使用过滤器来获得你的第二个ManyMany>你只能在视图中这样做。py

希望这是有意义的

最新更新