如何将多个模型绑定到一个 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 关系。如何才能做到这一点?有专门的领域吗?
【问题讨论】:
通常在这种情况下,您会创建一个将实例链接在一起的模型,例如带有ForeignKey
s 的ABCD
模型到所有这些模型。本质上,这就是 ManyToManyField
所做的:它在两者之间创建一个隐式表。
【参考方案1】:
在撰写本文时,这是不可能的。 ManyToManyField
[Django-doc] 有一个位置 to
参数:
<b>class ManyToManyField(to, **options)</b>
多对多关系。需要位置参数: 与模型相关的类,其工作方式与 它适用于
ForeignKey
,包括递归和惰性关系。
这也会造成一些混乱:mtm
应该为 some_a.mtm.all()
返回什么?所有相关的B
对象? B
、C
和 D
对象的元组?倒转关系的名称应该是什么?
但这并不意味着你不能模仿这样的关系。您可以制作一个行为类似于关系的模型。事实上,如果你定义一个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')
例如,我们可以通过以下方式获取所有相关ABCDRelation
s 的QuerySet
:
some_a.<b>mtm.all()</b>
或者您可以通过以下关系获得所有相关B
对象的QuerySet
:
B.objects.filter(<b>mtm__a=some_a</b>)
关系可以包含额外的数据,但本质上因此存储了模型对象如何相互关联的“元组”。
因此,这会创建一个实体关系模型,看起来或多或少类似于:
【讨论】:
感谢您的详细回复以及您为他的写作付出的时间!我想这样做,但后来我想也许还有另一种我不知道的方法。感谢您帮助我做出决定。以上是关于如何将多个模型绑定到一个 ManyToManyField?的主要内容,如果未能解决你的问题,请参考以下文章
将 ListBoxFor 绑定到 MVC 3 中的模型并使用另一个模型自动选择多个项目
如何对绑定到 mvc 中模型的相同属性的多个局部视图应用验证?