在 Django 中使用 2 个字段创建主键?

Posted

技术标签:

【中文标题】在 Django 中使用 2 个字段创建主键?【英文标题】:make primary key with 2 fields in Django? 【发布时间】:2011-06-19 19:23:54 【问题描述】:

我想从 Django 的 2 个字段中创建一个主键。

以下字段

- current Time 
- userId

我该怎么做?

Time + userid PK   [ Current Time + userid]

谢谢!!

【问题讨论】:

【参考方案1】:

大多数时候,您实际上并不需要将多列键作为主键。

Django 最好使用代理键 - 也就是说,它会自动定义一个名为 id 的自动增量字段并将其设置为主键。这几乎适用于所有用途。

如果您随后需要跨两个或多个字段对模型强制实施唯一约束,您可以使用内部 Meta 类中的 unique_together 设置。

【讨论】:

参考此link 了解代理键的工作原理..【参考方案2】:

它没有内置在 Django 中(请参阅#373),但请参阅http://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys 的底部进行讨论。我已经复制了这里的“替代方法”部分以供后代使用。

替代方法

notnotpeter:目前,您可以“伪造” 通过声明其中一个键为 Django中的主要并添加一个独特的 对模型的约束。 (需要更多 信息...示例?)

mjm:这仅在存在 要使用的非复合唯一键,如果我 了解这里提出的建议。 因此,它可能是一种可行的方式 挤压一个自然有的设计 CK进入Django,但没用 用于使用现有模式 只有CK。

djansoft:可以使用 独一无二。

东武:你不能只用一把钥匙。一种 用于说明的用例:a 命名空间标签?带有 CK 的型号 命名空间和名称。首要的 键不能只是名称空间或 只是名字,因为那将是 模糊的。唯一的解决方案(和我 不喜欢它,因为它是糟糕的建模 并强制数据库访问 在计数器上序列化)是使用 自动字段?。

toszter:叫我疯子,但为什么不呢? 将任意数量的列声明为 模型中的主键,其中 django 然后使用创建一个“隐藏” pk_composite 列,它只是一个哈希 行中的三个 pk 值? 当你对一个 pk 进行查找时,你 假设整个组合 values 是主键,什么都没有 或多或少。所以当你抬头 根据需要的值 创建完整的 pk_composite,哈希 总是计算,如果哈希 算法是公开的,可以关闭 URL,数据库中的查询字符串 查找,几乎在任何地方。 在我看来似乎很简单,但 然后我又不会进入伟大的 详细在这里。

话虽如此,我会在表上创建一个 ID 并将其作为主键。然后在 user_id + 时间戳上添加一个唯一的约束。

【讨论】:

【参考方案3】:

如果键必须是单列:

id 是“开箱即用”(variable.id)添加的,当前时间只需添加

from django.db import models

date = models.DateTimeField( auto_now_add=True)

在 yourapp/models.py 中

所以你有你的 2 个值,你可以把你的钥匙做成你想要的任何形状。

如果您想要多列键,请阅读其他答案。希望能帮到你。

【讨论】:

实际上 userid 字段是外键,这是用户表的主键,这就是为什么我很困惑如何做到这一点?

以上是关于在 Django 中使用 2 个字段创建主键?的主要内容,如果未能解决你的问题,请参考以下文章

在使用 UUID 字段作为主字段的 Django 模型中添加非主键自动字段或“序列”字段

Django model 中的字段解释

django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段

Django之ORM字段及查询

Django之ORM字段及查询

django 模型——model 字段