Почему Django UUIDField с editable = False является редактируемым? - PullRequest
0 голосов
/ 13 марта 2019

Я хочу сделать поле 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

Ответы [ 2 ]

4 голосов
/ 13 марта 2019

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

Если False, поле не будет отображаться ни в админке, ни в любом другом ModelForm. Они также пропускаются во время проверки модели. По умолчанию Правда.

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

1 голос
/ 13 марта 2019

Вы можете перезаписать метод сохранения - найдите значение в БД и задайте одинаковые значения перед сохранением, если они отличаются.

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