使用 Django 的复合/复合主/唯一键

Posted

技术标签:

【中文标题】使用 Django 的复合/复合主/唯一键【英文标题】:Compound/Composite primary/unique key with Django 【发布时间】:2011-01-17 06:25:29 【问题描述】:

如何使用 Django 创建具有复合(复合)主/唯一键的模型(以及表)?

【问题讨论】:

我已经实现了对虚拟复合键的基本支持。适合访问现有数据库,但对于开发来说,最好继续使用标准 django id 列。在这里检查我的答案 - ***.com/a/65404017/46548 【参考方案1】:

Django 不支持复合主键。您可以使用 Meta.unique_together 创建单个复合唯一键。

【讨论】:

感谢伊格纳西奥!如何使用多对多关系进行这项工作?它会起作用吗? 真的很好奇你认为复合唯一键和多对多关系之间的联系是... 假设我们有 2 个实体:学生和科目。学生可以选修很多科目。具有复合主键的连接表: Table student_subjects: -------------------------------- student_id subject_id 这是一种基本技术创建 n 对 n 关系。 那么就把它放到直通表中吧。 关于多对多,引用的链接说:A ManyToManyField 不能包含在 unique_together 中。 (甚至不清楚这意味着什么!)如果您需要验证与 ManyToManyField 相关的唯一性,请尝试使用信号或显式直通模型。【参考方案2】:

如果您只想将唯一的混合字段一起使用,请使用以下代码:

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

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

但是,如果您希望一起唯一并且其中一个列是主要的,请为模型列设置 primary 参数,类似于以下代码:

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

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

【讨论】:

【参考方案3】:

复合键由多个属性组成,用于唯一标识实体出现。这与复合键的不同之处在于,构成键的一个或多个属性本身并不是简单的键。

例如,您有一个保存您的 CD 收藏的数据库。其中一个实体称为轨道,它包含 CD 上轨道的详细信息。这有一个 CD 名称、曲目编号的组合键。

【讨论】:

以上是关于使用 Django 的复合/复合主/唯一键的主要内容,如果未能解决你的问题,请参考以下文章

jpa 复合主键并可与唯一键连接

mysql的联合主键与复合主键区别

复合可分解唯一键

Hibernate复合主键映射

Hibernate复合主键映射

Hibernate 的复合主键