20

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

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

primary_key=True暗示null=Falseunique=True.

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

谢谢你。

更新声明:

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

1 回答 1

22

改用AutoFieldwith 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约束。

于 2011-05-19T17:05:45.713 回答