如何将多个模型绑定到一个ManyToManyField?

时间:2019-01-16 13:18:42

标签: django django-models orm django-orm

例如,有这样的类:

class A(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
 mtm = models.ManyToManyField(B, C, D)

class B(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
class C(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
class D(models.Model):
 id = models.CharField(max_length=256, primary_key=True)

我知道该字段的实现类并且做错了,这样做是为了使其更清楚。您需要具有该模型,并且与模型b,C,D有ManyToMany的关系。如何才能做到这一点?有一个特殊的领域吗?

1 个答案:

答案 0 :(得分:1)

在撰写本文时,这是不可能的。 ManyToManyField [Django-doc]的位置参数为to,其参数为:

class ManyToManyField(to, **options)
     

多对多关系。需要位置参数: the   与模型相关的类,其工作原理与   它适用于ForeignKey,包括递归和惰性关系。

这还会造成一些混乱:mtm应该返回some_a.mtm.all()的什么?所有相关的B对象? BCD对象的元组?反向关系的名称是什么?

但是,这并不意味着您不能模仿这种关系。您可以制作一个像关系的模型。实际上,如果您定义ManyToManyField,则Django将创建一个表来存储此关系中的数据。

所以我们可以定义这样的模型:

class ABCDRel(models.Model):
    a = models.ForeignKey(A, on_delete=models.CASCADE, related_name='mtm')
    b = models.ForeignKey(B, on_delete=models.CASCADE, related_name='mtm')
    c = models.ForeignKey(C, on_delete=models.CASCADE, related_name='mtm')
    d = models.ForeignKey(D, on_delete=models.CASCADE, related_name='mtm')

例如,我们可以通过以下方式获得所有相关QuerySet的{​​{1}}:

ABCDRelation

或者您可以通过以下关系通过以下方式获得所有相关some_a.mtm.all()对象的QuerySet

B

该关系可以包含额外的数据,但从本质上讲,它存储模型对象之间如何相互关联的“元组”。

因此,这创建了一个看起来或多或少像的实体关系模型:

Entity-relation model of this modeling