例如,有这样的类:
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的关系。如何才能做到这一点?有一个特殊的领域吗?
答案 0 :(得分:1)
在撰写本文时,这是不可能的。 ManyToManyField
[Django-doc]的位置参数为to
,其参数为:
class ManyToManyField(to, **options)
多对多关系。需要位置参数: the 与模型相关的类,其工作原理与 它适用于
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')
例如,我们可以通过以下方式获得所有相关QuerySet
的{{1}}:
ABCDRelation
或者您可以通过以下关系通过以下方式获得所有相关some_a.mtm.all()
对象的QuerySet
:
B
该关系可以包含额外的数据,但从本质上讲,它存储模型对象之间如何相互关联的“元组”。
因此,这创建了一个看起来或多或少像的实体关系模型: