Почему Django UUIDField с editable = False доступно для редактирования?

#python #django #python-3.x #django-models

#python #django #python-3.x #django-модели

Вопрос:

Я хочу сделать поле UUID недоступным для редактирования в Django, я использую uuid в качестве имен статических файлов, которые теряют свою целостность при изменении соответствующего UUID. Я пытался сделать UUID доступным только для чтения (в оболочке, не заботясь о формах и администраторе), чтобы ничто и никогда не меняло uuid однажды определенной модели.

 class Car(models.Model):
    uuid = muuid = models.UUIDField(default=uuid.uuid4, editable=False)
  

итак, когда я пытаюсь изменить uuid в оболочке

 >>> x = Car.objects.first()
>>> x.uuid
    UUID('acd963cf-aa2f-4f44-988d-87091d492766')
>>> x.uuid = uuid.uuid4
>>> x.save()
>>> x.uuid
    UUID('1155ce6d-d783-4dc8-a970-a004dc63f3d8')
  

Версия Django 2.1.7, база данных PostgreSQL 10

Ответ №1:

Проверьте документы на наличие редактируемого поля.

Если False, поле не будет отображаться в admin или любой другой форме модели. Они также пропускаются во время проверки модели. Значение по умолчанию равно True.

Это не означает, что это нельзя изменить из оболочки.

Ответ №2:

Вы могли бы перезаписать метод сохранения — выполнить поиск значения в базе данных и установить одинаковые значения перед сохранением, если они отличаются.

     def save(self, *args, **kwargs):
        if self.pk:
            obj = Car.objects.values('uuid').get(pk=self.pk)
            if obj.get('uuid') != self.uuid:
                self.uuid = obj.get('uuid')
        super().save(*args, **kwargs)