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恰巧不知道当前操作(更新还是插入)的数据验证器,并且视图只是重新加载了错误。
答案 0 :(得分:0)
已解决-问题是由超类的EnableStreamingProperty = true
方法内的行# instance._state.adding = False
注释引起的。不知道为什么它被注释掉了。