【发布时间】: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=True 在 external_id 字段的定义中的存在使 Django 认为我不是在编辑现有记录而是到达此表单以创建新条目。
我到达屏幕的网址是正确的,即/product/<some id here>/change/,而不是/product/add
在数据库中,external_id 字段中的所有现有值都是非空的(也没有空字符串)并且是唯一的。
如果我通过添加一些调试正确理解,则会发生错误“具有此外部 ID 的产品已经存在”BEFORE save() 甚至被调用,例如 unique=True 调用了一些发生的 Django 数据验证器不知道当前的操作(更新与插入)并且视图只是重新加载错误。
【问题讨论】:
标签: django model insert unique