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

4 django orm django-models 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)
Run Code Online (Sandbox Code Playgroud)

我知道字段的实现类是错误的,这样做是为了更清楚。您需要拥有该模型并且与模型 b、C、D 建立了 ManyToMany 关系。如何才能做到这一点?有专门的领域吗?

Wil*_*sem 8

在撰写本文时,这是不可能的。阿ManyToManyField[Django的DOC]具有位置to与参数:

class ManyToManyField(to, **options)
Run Code Online (Sandbox Code Playgroud)

多对多的关系。需要一个位置参数:与模型相关的类,它的工作方式与完全相同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')
Run Code Online (Sandbox Code Playgroud)

例如,我们可以通过以下方式获得QuerySet所有相关ABCDRelations 的 a:

some_a.mtm.all()
Run Code Online (Sandbox Code Playgroud)

或者您可以通过以下关系获得QuerySet所有相关B对象的一个:

B.objects.filter(mtm__a=some_a)
Run Code Online (Sandbox Code Playgroud)

关系可以包含额外的数据,但本质上因此存储了模型对象如何相互关联的“元组”。

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

此建模的实体关系模型