【问题标题】:Django framework form is trying to insert a new record instead of updatingDjango 框架表单正在尝试插入新记录而不是更新
【发布时间】:2019-03-26 14:18:47
【问题描述】:

Django 1.11.4 python 3.6

我有一个默认的 Django 框架表单,用于更新和创建给定模型的记录。主键(“id”字段)由 Django 生成。其余的在我的模型中定义(见下文)。该模型是 AuditModel 类的子类,该类重载 save 方法。 此时一切正常,即我可以使用标准 Django 表单界面创建新记录或更新现有记录。

class Product(AuditModel):

    internal_id = models.CharField(max_length=100, null=True, blank=True, help_text="Internal ID")

    external_id = models.CharField(max_length=100, null=False, blank=False, help_text="External ID", verbose_name="External ID")

    label = models.ForeignKey(Label, help_text="Label")

class AuditModel(models.Model):
    created = models.DateTimeField(null=True,editable=False)
    updated = models.DateTimeField(null=True,editable=False)

    def save(self, *args, **kwargs):
        date = timezone.localtime()

        if self._state.adding :
            self.created = date
        self.updated = date
        super(AuditModel, self).save()

我的问题:我希望 external_id 是唯一的(但不是主键),即

external_id = models.CharField(max_length=100, unique=True, null=False, blank=False, help_text="External ID", verbose_name="External ID")

一旦我将unique=True 添加到external_id 字段的定义中,视图的行为就会发生变化:在尝试更新现有记录时,我在external_id 文本框旁边收到一条错误消息“已使用此外部ID 的产品存在。”并且数据库中没有发生任何变化。不知何故,unique=Trueexternal_id 字段的定义中的存在使 Django 认为我不是在编辑现有记录而是到达此表单以创建新条目。

我到达屏幕的网址是正确的,即/product/<some id here>/change/,而不是/product/add

在数据库中,external_id 字段中的所有现有值都是非空的(也没有空字符串)并且是唯一的。

如果我通过添加一些调试正确理解,则会发生错误“具有此外部 ID 的产品已经存在”BEFORE save() 甚至被调用,例如 unique=True 调用了一些发生的 Django 数据验证器不知道当前的操作(更新与插入)并且视图只是重新加载错误。

【问题讨论】:

    标签: django model insert unique


    【解决方案1】:

    已解决 - 问题是由在超类的 def from_db() 方法中注释掉的行 # instance._state.adding = False 引起的。不知道为什么它被注释掉了。

    【讨论】:

      猜你喜欢
      • 2014-12-16
      • 2019-09-21
      • 2023-04-11
      • 1970-01-01
      • 2014-05-18
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      相关资源
      最近更新 更多