django中的主键和唯一键

时间:2011-05-18 03:05:59

标签: django primary-key unique-key

我有一个自定义主键需要在模型中的特定数据上设置。

这还不够,因为尝试插入重复的数字成功了。所以现在当我将primary_key=True替换为unique=True时,它正常工作并拒绝重复的数字!!但根据document使用字段)。

primary_key=True暗示null=Falseunique=True.

  

这让我感到困惑,为什么呢   它首先接受价值   内置unique=True

谢谢。

更新声明:

   personName = models.CharField(primary_key=True,max_length=20)

1 个答案:

答案 0 :(得分:15)

使用AutoField代替primary_key

修改

如果您不使用AutoField,则必须手动计算/设置主键字段的值。这相当麻烦。您是否需要 ReportNumber到主键?您仍然可以使用唯一的报告编号查询报告,以及自动递增的整数主键。

编辑2:

当您说允许重复的主键值时,您指示正在发生的事情是更新具有相同主键的现有记录 - 实际上在数据库中实际上没有两个具有相同主键的对象(可以不会发生。问题在于Django的ORM层选择执行UPDATE(修改现有数据库记录)与INSERT INTO(创建新数据库记录)的方式。从django.db.models.base.Model.save_base()

查看此行
if (force_update or (not force_insert and
        manager.using(using).filter(pk=pk_val).exists())):
    # It does already exist, so do an UPDATE.

特别是这段代码:

manager.using(using).filter(pk=pk_val).exists()

这说:“如果数据库中存在与此Model具有相同主键的记录,则进行更新。”因此,如果您重新使用主键,Django会假定您正在进行更新,因此不会引发异常或错误。


我认为最好的想法是让Django为您生成主键,然后有一个单独的字段(CharField或其他)具有unique约束。