我有一个以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
答案 0 :(得分:6)
我的意思是通过django admin更新实例。改变价值 myfield并单击“保存”按钮不会更改实际实例 但要创建(复制所有其他字段)新的字段。
这是django的工作方式,来自documentation:
如果对象的主键属性设置为值为True
的值(即None
以外的值或空字符串),则Django执行{{1} }。
如果未设置对象的主键属性或UPDATE
未更新任何内容,则Django会执行UPDATE
。
你在第二个条款中被抓住了。 django第一次尝试进行更新时,您的新主键值不存在;所以django会插入一条新纪录。
您需要将其作为主键或仅作为键吗?通常,主键是唯一值;一旦创建了一条记录(并且因为你有外键,链接) - 你不会修改主键,否则你的关系就会中断。实际上,如果您尝试这样做,大多数数据库都会引发错误;因为你将有记录指向一个不存在的密钥。