在Django中使用2个字段制作主键?

Mud*_*sar 4 database django

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

字段在下面

- current Time 
- userId
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点??

Time + userid {PK }  [ Current Time + userid]
Run Code Online (Sandbox Code Playgroud)

谢谢!!

Dan*_*man 15

大多数情况下,您实际上并不需要将多列密钥作为主键.

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

如果您需要跨两个或多个字段对模型强制执行唯一约束,则可以使用unique_together内部Meta类中的设置.


Sam*_*lan 6

它没有内置到Django中(参见#373),但请参阅http://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys的底部进行讨论.为了后代,我复制了"替代方法"部分.

替代方法

notnotpeter:目前,您可以通过在Django中声明其中一个键为主键并为模型添加唯一约束来"伪造"它.(需要更多信息......例子?)

mjm:这只有在使用非复合唯一键时才有效,如果我理解这里提出的是什么.因此,作为将自然拥有CK的设计压缩到Django中的方法可能是可行的,但是对于仅具有CK的现有模式来说它是没有用的.

djansoft:可以使用unique-together完成.

东武:你不能只使用一把钥匙.用例来说明:NamespacedTag?带有命名空间和名称的CK的模型.主键不能只是命名空间或只是名称,因为它不明确.唯一的解决方案(我不喜欢它,因为它是错误的建模并强制数据库访问在计数器上序列化)是使用AutoField?.

toszter:叫我疯了,但为什么不在你的模型中声明任意数量的列作为主键,然后django用来创建一个"隐藏的"pk_composite列,它只是行中三个pk值的哈希值?当你对pk进行查找时,你假设整个值的组合是主键,没有或多或少.因此,当您根据创建完整pk_composite所需的值进行查找时,哈希始终会计算,如果哈希算法是公共的,则可以使用URL,db查找中的查询字符串以及几乎任何位置.在我的脑海里似乎很简单但是我再也不会在这里详细介绍.

话虽这么说,我会在桌面上创建一个ID,并将其作为主键.然后在user_id +时间戳上添加唯一约束.