Django 或类似的复合主键
Posted
技术标签:
【中文标题】Django 或类似的复合主键【英文标题】:Django or similar for composite primary keys 【发布时间】:2010-12-10 02:28:39 【问题描述】:我正在为我的工程公司编写一个 Web 应用程序(警告:我只是一个业余爱好的程序员)并计划使用 Django,直到遇到这个问题。我要使用的模型自然具有多列主键。根据http://code.djangoproject.com/ticket/373,我不能使用 Django,至少不能使用已发布的版本。任何人都可以帮助我解决问题,无论是通过另一个 Web 框架(请仅基于 Python)还是建议对模型进行更改以使其适用于 Django 的限制?我真的很希望后者,因为我希望以此为契机来学习 Django。
示例: 表一有 part_number 和 part_revision 作为两个字段,应该包含一个主键。一个 P/N 可以存在于多个修订版中,但 P/N + rev 是唯一的。
表二的主键为part_number、part_revision 和dimension_number。特定转速的 P/N 可以有多个维度,但是,每个维度都是唯一的。另外,在这种情况下,P/N + rev 应该是表一的 ForeignKey。
【问题讨论】:
【参考方案1】:SQLAlchemy 支持复合主键和外键,因此任何基于 SQLAlchemy 的框架(想到 Pylons 和 Werkzeug)都应该满足您的需求。但是代理主键更容易使用,而且得到更好的支持。
【讨论】:
【参考方案2】:我强烈建议使用代理键。不是因为它是“Djangoesque”。假设您使用包含 part_number 的复合键。如果一段时间后您的公司决定更改该字段的格式(以及值)怎么办?或者一般来说,任何领域?您不想处理更改主键。我不知道您在使用由“真实”值组成的复合键时会看到什么好处,但我认为这不值得麻烦。使用无意义的自动递增键(这可能会使复合键无用)。
【讨论】:
这应该被修改了很多。关于为什么代理是一个更好的主意的一篇好文章是:agiledata.org/essays/keys.html 软件行业最大的问题是每个人都在尝试更大规模地解决给定的问题。另一方面,如果我试图将 Django 应用于其结构可能会或可能不会更改的预定义数据集怎么办?更重要的是,这是 Django 本身的用例之一:“有期限的完美主义者的框架”。【参考方案3】:为什么不添加一个普通的主键,然后将part_number
和part_revision
指定为unique_together
?
这本质上就是米奇小麦所说的 Djangoish(Djangonic?)方式。
【讨论】:
哇!这实际上是最好的解决方案! Djangonic 与 Pythonic 保持一致 :)【参考方案4】:一种解决方法是创建一个代理键(一个自动递增列)作为主键列,并在您的域复合键上放置一个唯一索引。
然后外键将引用代理主键列。
【讨论】:
以上是关于Django 或类似的复合主键的主要内容,如果未能解决你的问题,请参考以下文章