使用 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 的复合/复合主/唯一键的主要内容,如果未能解决你的问题,请参考以下文章