如何将多个模型绑定到一个 ManyToManyField?
How to bind multiple models to one ManyToManyField?
例如,有这样的 classes:
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)
我知道字段的实现class 而且错了,这样做是为了更清楚。您需要拥有该模型并且与模型 b、C、D 建立了 ManyToMany 关系。如何才能做到这一点?有专门的字段吗?
在撰写本文时,这是不可能的。 ManyToManyField
[Django-doc] 有一个位置 to
参数:
<b>class ManyToManyField(to, **options)</b>
A many-to-many relationship. Requires a positional argument: the
class to which the model is related, which works exactly the same as
it does for ForeignKey
, including recursive and lazy relationships.
这也会造成一些混乱:mtm
return 应该为 some_a.mtm.all()
做什么?所有相关的 B
对象? B
、C
和 D
对象的元组?反转关系的名称应该是什么?
但这并不意味着你不能模仿这样的关系。你可以制作一个像关系一样的模型。事实上,如果您定义一个 ManyToManyField
,Django 将创建一个 table 来存储来自该关系的数据。
所以我们可以定义这样的模型:
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
的 QuerySet
,其中:
some_a.<b>mtm.all()</b>
或者您可以通过以下关系获得所有相关 B
对象的 QuerySet
:
B.objects.filter(<b>mtm__a=some_a</b>)
该关系可以包含额外的数据,但本质上因此存储 "tuples" 模型的对象如何相互关联。
因此,这创建了一个实体关系模型,看起来或多或少类似于:
例如,有这样的 classes:
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)
我知道字段的实现class 而且错了,这样做是为了更清楚。您需要拥有该模型并且与模型 b、C、D 建立了 ManyToMany 关系。如何才能做到这一点?有专门的字段吗?
在撰写本文时,这是不可能的。 ManyToManyField
[Django-doc] 有一个位置 to
参数:
<b>class ManyToManyField(to, **options)</b>
A many-to-many relationship. Requires a positional argument: the class to which the model is related, which works exactly the same as it does for
ForeignKey
, including recursive and lazy relationships.
这也会造成一些混乱:mtm
return 应该为 some_a.mtm.all()
做什么?所有相关的 B
对象? B
、C
和 D
对象的元组?反转关系的名称应该是什么?
但这并不意味着你不能模仿这样的关系。你可以制作一个像关系一样的模型。事实上,如果您定义一个 ManyToManyField
,Django 将创建一个 table 来存储来自该关系的数据。
所以我们可以定义这样的模型:
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
的 QuerySet
,其中:
some_a.<b>mtm.all()</b>
或者您可以通过以下关系获得所有相关 B
对象的 QuerySet
:
B.objects.filter(<b>mtm__a=some_a</b>)
该关系可以包含额外的数据,但本质上因此存储 "tuples" 模型的对象如何相互关联。
因此,这创建了一个实体关系模型,看起来或多或少类似于: