【问题标题】:Primary key and unique key in djangodjango中的主键和唯一键
【发布时间】:2011-05-18 03:05:59
【问题描述】:

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

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

primary_key=True 暗示 null=Falseunique=True.

这让我很困惑,为什么 它首先接受价值 有一个内置的unique=True ?

谢谢。

更新声明:

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

【问题讨论】:

    标签: django primary-key unique-key


    【解决方案1】:

    改用AutoFieldprimary_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.
    

    特别是这段sn-p的代码:

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

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


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

    【讨论】:

    • @mipadi :我的要求是手动设置。我理解您对AutoFiled 的关注。但同样,您的解决方案将解决我希望它是 AutoField 的查询。我想要的是来自注册商的手动输入。同样,即使我使用 CharFiled,我也会将原始字段替换为新的 CharField 记录。如果你注意到我问题的最后一部分,我会问一个疑问,为什么它不起作用?为什么即使它在primary_key 中有默认unique=True 也会替换?
    • @Nagaraj Tantri:对。我在问为什么报告编号必须是主键。您可以拥有一个唯一的、手动输入的报告编号(您甚至可以为其编制索引以加快查询速度),以及一个单独的、自动生成的 ID 编号(这也是主键)。
    • 另外,您使用的是什么数据库后端?
    • @mipadi :我必须保留记录号,因为管理员希望它是整数。我使用 Sqlite3 。由于我对personName=models.CharField(primary_key=True,max_length=20) 有另一个类似的问题,我认为只用一个字段而不是两个类似的查询发布问题。
    • 另外,对于实际问题,我没有得到任何答案,所以我再次用CharField 更新问题。 CharField 甚至有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2011-09-16
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2012-01-27
    • 2017-04-22
    相关资源
    最近更新 更多