Django或类似的复合主键

时间:2009-10-26 11:19:28

标签: python django web-applications django-models

我正在为我的工程公司编写一个Web应用程序(警告:我只是一个爱好的程序员)并计划使用Django,直到我遇到这个问题。我想要使​​用的模型自然具有多列主键。根据{{​​3}},我不能使用Django,至少不是发布版本。任何人都可以帮助我解决方法,无论是通过另一个Web框架(仅限基于Python)还是建议对模型进行更改,以便它能够与Django的局限性一起使用?我真的希望有后者,因为我希望用它来学习Django。

实施例: 表1将part_number和part_revision作为应包含主键的两个字段。 P / N可以存在多个版本,但P / N + rev是唯一的。

表2将part_number,part_revision和dimension_number作为其主键。特定转速下的P / N可以具有多个维度,但是每个维度都是唯一的。此外,在这种情况下,P / N + rev应该是表1的ForeignKey。

5 个答案:

答案 0 :(得分:23)

为什么不添加普通主键,然后将part_numberpart_revision指定为unique_together

这基本上是Djangoish(Djangonic?)做Mitch Wheat所说的方式。

答案 1 :(得分:19)

解决方法是创建代理键(自动增量列)作为主键列,并在域组合键上放置唯一索引。

外键将引用代理主键列。

答案 2 :(得分:14)

我强烈建议使用代理键。不是因为它是“Djangoesque”。假设您使用包含part_number的复合键。如果一段时间后贵公司决定更改该字段的格式(以及价值),该怎么办?或者一般来说,任何领域?您不希望处理更改主键。我不知道你在使用由“真实”值组成的复合键时看到了什么好处,但我认为这不值得麻烦。使用无意义的自动增量键(这可能会使复合键无效)。

答案 3 :(得分:2)

SQLAlchemy支持复合主键和外键,因此任何基于SQLAlchemy的框架(Pylons和Werkzeug)都应该满足您的需求。但代理主键更容易使用,无论如何都得到更好的支持。

答案 4 :(得分:0)

如果您只想要唯一的混合字段:

class MyTable(models.Model):
    class Meta:
        unique_together = (('key1', 'key2'),)

    key1 = models.IntegerField()
    key2 = models.IntegerField()

但是如果你想要一起独一无二并且其中一列是主要的,请尝试类似下面的代码:

class MyTable(models.Model):
    class Meta:
        unique_together = (('key1', 'key2'),)

    key1 = models.IntegerField(primary_key=True)
    key2 = models.IntegerField()