#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)