2011-05-18 338 views
14

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

这是不够的,因为尝试插入重复号码成功。所以现在当我取代primary_key=Trueunique=True它正常工作,并拒绝重复的数字!!。但根据这document其中使用字段)。

primary_key=True意味着null=Falseunique=True.

这让我困惑于为什么 它具有一个内置的unique=True接受摆在首位 价值?

谢谢。

更新语句:

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

回答

13

使用带primary_key代替AutoField

编辑:

如果不使用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约束。

+0

@Nagaraj Tantri:我编辑了我的答案,以解决您的评论。 – mipadi 2011-05-19 17:17:36

+1

@mipadi:我的要求是关于手动设置。我理解你对'AutoFiled'的关注。但是,再次,您的解决方案将解决查询在哪里我希望它是AutoField。我想要的是从注册商那里手动输入。再次,即使我使用** CharFiled **我会得到原来的字段替换为新的“CharField”记录。如果你注意到我的问题的最后一部分,我曾质疑它为什么不起作用?为什么它会在'primary_key'中替换它的默认'unique = True'? – 2011-05-20 10:59:24

+1

@Nagaraj Tantri:对。我在问为什么报告号码必须成为主要关键。您可以拥有一个独特的手动输入报告编号(您甚至可以将其编入索引以更快地查询)以及单独的自动生成的ID编号(也是主键)。 – mipadi 2011-05-20 14:54:41