繁体   English   中英

Django或类似的复合主键

[英]Django or similar for composite primary keys

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

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

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

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

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

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

然后,外键将引用代理主键列。

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

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

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

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM