我们希望在同一模型中具有多对多和一对一的关系。让我举个例子。
class Definition(models.Model):
value = models.CharField(max_length=100)
...
class Container(models.Model):
name = models.CharField(max_length=30)
container_specific_defn = models.OneToOneField(Definition, null=True, blank=True)
definitions = models.ManyToManyField(Definition)
如您所见,Container
模型与Definition
模型同时具有1to1和m2m相对关系。即。我希望Container
可以有任意数量的定义,但是我们要添加到definitions
集的defn不应添加到任何容器的container_specific_defn
字段中。
但是上述模型设计允许将分配给一个污染者的defn
字段的container_specific_defn
添加到另一个容器的definitions
集。
container_specific_defn = Definition.objects.create(value='container_specific')
global_defn = Definition.objects.create(value='global')
c1 = Container.objects.create(name='c1', container_specific_defn=container_specific_defn)
c2 = Container.objects.create(name='c2')
c2.definitions.add(container_specific_defn)
c2.save()
# [container_specific_defn]
我需要更改模型设计吗?
答案 0 :(得分:0)
您的模型设计没有确定的错误,但是我可能会对此建模不同:使用带有“特定”字段的贯通表。
class Container(models.Model):
name = models.CharField(max_length=30)
definitions = models.ManyToManyField(Definition, through="ContainerDefinition")
class ContainerDefinition(models.Model):
container = models.ForeignKey(Container, on_delete=models.CASCADE)
definition = models.ForeignKey(Definition, on_delete=models.CASCADE)
specific = models.BooleanField(default=False)