Фреймворк Django пытается вставить новую запись вместо обновления - PullRequest
0 голосов
/ 26 марта 2019

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это случилось, что не знал о текущем действии (обновление против вставки), и представление просто перезагружено с ошибкой.

1 Ответ

0 голосов
/ 10 апреля 2019

Решено - Проблема была вызвана закомментированной строкой # instance._state.adding = False внутри def from_db() метода суперкласса.Не знаю, почему это закомментировано.

...