Django在同一模型中具有一对一和多对多的关系

时间:2019-10-01 04:32:55

标签: python django django-models

我们希望在同一模型中具有多对多和一对一的关系。让我举个例子。

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]

我需要更改模型设计吗?

1 个答案:

答案 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)