【问题标题】:Django - updating primary key charfield duplicates instanceDjango - 更新主键字符域重复实例
【发布时间】:2023-04-01 04:48:02
【问题描述】:

我有一个带有 charfield 作为主键的模型。 创建实例时(通过管理面板)一切都很好,我的干净方法也可以。但是,如果我回来更新 myfield,不仅 clean 方法无法捕获非数字字符,而且整个实例都是重复的。一个具有旧的 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

【问题讨论】:

  • 为什么你需要它成为 pk?为什么没有默认的自动 ID?
  • 不是我的电话,项目要求
  • 为什么不将验证放入ModelForm
  • 我的意思是通过 django admin 更新一个实例。更改 myfield 的值并单击保存按钮不会更改实际实例,而是创建(复制所有其他字段)新实例。

标签: python django django-models django-admin


【解决方案1】:

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

这就是 django 的工作原理,来自documentation

    1234563
  • 如果对象的主键属性没有设置或者UPDATE没有更新任何东西,Django会执行INSERT

你陷入了第二个子句。 django 第一次尝试更新时,新的主键值不存在;所以django会插入一条新记录。

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

【讨论】:

  • 好的。如何将 myfield 保留为 pk 但防止编辑?如果我在 ModelAdmin 上设置 readonly_fields = ('myfield',) 它在实例创建期间也是只读的。这当然没有意义。
  • 我给你的最好建议是使用内置主键作为实际主键,并使用myfield 作为单独的值。否则,您需要确保主键是唯一的并自己执行所有完整性规则。要求用户可以编辑主键是灾难的根源。
  • 我明白了。有没有办法让它可由用户创建但不可编辑?
  • 这取决于您是否希望用户为其输入值。
  • 是的,用户在实例创建过程中输入值。
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 2011-09-16
  • 2021-02-11
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
相关资源
最近更新 更多