Django - 更新主键字段重复实例

时间:2014-01-01 20:41:35

标签: python django django-models django-admin

我有一个以charfield作为主键的模型。 在创建实例时(通过管理面板)一切都很好,我的干净方法也可以。但是,如果我回来更新myfield,不仅清理方法无法捕获非数字字符,而且整个实例都是重复的。一个具有旧的myfield值,另一个具有改变的myfield。

# models.py
class Mymodel(models.Model):
    myfield = models.CharField(primary_key=True, max_length=10)
    ...
    def clean(self):
        if not re.match(r'[0-9]+', self.pesel):
            raise ValidationError('Digits only.', code='invalid')
        super(Mymodel, self).clean()

我该如何解决这个问题?我需要它作为主键,我需要它是可编辑的。这个干净的额外问题不能很好地运作,我认为它可能是连接的。我是Django 1.5.5

1 个答案:

答案 0 :(得分:6)

  

我的意思是通过django admin更新实例。改变价值   myfield并单击“保存”按钮不会更改实际实例   但要创建(复制所有其他字段)新的字段。

这是django的工作方式,来自documentation

  • 如果对象的主键属性设置为值为True的值(即None以外的值或空字符串),则Django执行{{1} }。

  • 如果未设置对象的主键属性或UPDATE未更新任何内容,则Django会执行UPDATE

你在第二个条款中被抓住了。 django第一次尝试进行更新时,您的新主键值不存在;所以django会插入一条新纪录。

您需要将其作为主键或仅作为吗?通常,主键是唯一值;一旦创建了一条记录(并且因为你有外键,链接) - 你不会修改主键,否则你的关系就会中断。实际上,如果您尝试这样做,大多数数据库都会引发错误;因为你将有记录指向一个不存在的密钥。