如何在Django中为同一个表创建多个一对多关系?

时间:2013-09-04 21:13:23

标签: django django-models

首先,我要澄清一点,我正试图建立一对多关系,而不是多对一关系。我已经了解了ForeignKeys的工作方式。

为了讨论,我简化了我的模型;在实际实施中,它们比现场更丰富。

我有一个名为ColumnDefinition的模型:

class ColumnDefinition(Model):
    column_name = CharField(max_length=32)
    column_type = PositiveSmallIntegerField()
    column_size = PositiveSmallIntegerField(null=True, blank=True)

我认为有一个注册表。每个注册表都有一组用于输入和输出定义的独立列。我把理论上的“OneToManyField”放在那里来展示我想要做的事情。

class Registry(Model):
    input_dictionary = OneToManyField(ColumnDefinition)
    output_dictionary = OneToManyField(ColumnDefinition)
    created_date = DateTimeField(auto_now_add=True, editable=False)

ColumnDefinition只与一个注册表有关。所以这不是一个多对多的关系。如果我在ForeignKey上放置ColumnDefinition而不是创建反向关系,它只能创建一个反向,而我需要输入和输出反向。

如果我可以绕过它,我不想像在ColumnDefinition上添加“column_registry_type”字段那样做任何事情。

有没有人对如何解决这个问题有任何好的想法?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以而且应该在ForeignKey上定义两个不同的ColumnDefinition字段。只需确保为其中至少一个指定related_name值即可。 https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name

答案 1 :(得分:0)

您可以在ForeignKeys上添加两个ColumnDefinition,一个用于输入,一个用于输出,并将它们分开related_names

class ColumnDefinition(Model):
    ...
    input_registry = models.ForeignKey(Registry, related_name='input_columns')
    output_registry = models.ForeignKey(Registry, related_name='output_columns')

然后,您可以访问registry.input_columns等列。