Django框架表单正在尝试插入新记录而不是更新

时间:2019-03-26 14:18:48

标签: django model insert unique

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=True字段的定义中以某种方式出现external_id使得Django认为我不是在编辑现有记录,而是到达此表单以创建新条目。

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

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

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

1 个答案:

答案 0 :(得分:0)

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