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

gwa*_*dze 2 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()
Run Code Online (Sandbox Code Playgroud)

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

Bur*_*lid 6

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

这就是django的工作方式,来自文档:

  • 如果对象的主键属性设置为计算值True(即,除None空字符串以外的值),则Django执行UPDATE.

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

您将陷入第二个条款.django第一次尝试进行更新时,您的新主键值不存在; 所以django会插入一条新纪录.

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