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

Posted

技术标签:

【中文标题】如何将多个模型绑定到一个 ManyToManyField?【英文标题】:How to bind multiple models to one ManyToManyField? 【发布时间】:2019-06-10 14:11:27 【问题描述】:

例如,有这样的类:

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 关系。如何才能做到这一点?有专门的领域吗?

【问题讨论】:

通常在这种情况下,您会创建一个将实例链接在一起的模型,例如带有ForeignKeys 的ABCD 模型到所有这些模型。本质上,这就是 ManyToManyField 所做的:它在两者之间创建一个隐式表。 【参考方案1】:

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

<b>class ManyToManyField(to, **options)</b>

多对多关系。需要位置参数: 与模型相关的类,其工作方式与 它适用于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')

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

some_a.<b>mtm.all()</b>

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

B.objects.filter(<b>mtm__a=some_a</b>)

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

因此,这会创建一个实体关系模型,看起来或多或少类似于:

【讨论】:

感谢您的详细回复以及您为他的写作付出的时间!我想这样做,但后来我想也许还有另一种我不知道的方法。感谢您帮助我做出决定。

以上是关于如何将多个模型绑定到一个 ManyToManyField?的主要内容,如果未能解决你的问题,请参考以下文章

OpenUI5 表 - 将多个模型绑定到行项目

将 ListBoxFor 绑定到 MVC 3 中的模型并使用另一个模型自动选择多个项目

如何对绑定到 mvc 中模型的相同属性的多个局部视图应用验证?

如何将数据绑定到 Angular 2 中的多个嵌套组件?

如何将单个 IOptions POCO 交叉绑定到多个配置提供程序?

Xamarin Forms 1 视图绑定到多个对象