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
текстовое поле «Продукт с таким внешним идентификатором уже существует».и никаких изменений не происходит в БД.Каким-то образом присутствие unique=True
в определении поля external_id
заставляет Джанго думать, что я не редактирую существующую запись, но прибыл в эту форму, чтобы создать новую запись.
URL, который я прибыл наэкран с верным, то есть /product/<some id here>/change/
, а не /product/add
В БД все существующие значения в поле external_id
являются ненулевыми (без пустых строк) и уникальными.
Если я правильно понял, добавив некоторую отладку, происходит ошибка «Продукт с этим внешним идентификатором уже существует» ДО save()
даже вызывается, как unique=True
вызывает некоторый валидатор данных Djangoэто случилось, что не знал о текущем действии (обновление против вставки), и представление просто перезагружено с ошибкой.