为什么带有editable = False的Django UUIDField是可编辑的?

时间:2019-03-13 19:06:12

标签: python django python-3.x django-models

我想使UUID字段在Django中不可编辑,我将uuid用作静态文件的名称,如果更改了相应的UUID,它将失去其完整性。我试图将UUID设置为只读(在Shell上,不关心表单和管理),以使任何东西都永远不要更改定义后的模型的uuid。

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

所以当我尝试更改shell中的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 个答案:

答案 0 :(得分:4)

检查文档中的editable field

  

如果为False,则该字段将不会在管理员或其他任何人中显示    模型表格。在模型验证期间也将跳过它们。默认是    是的。

这并不意味着不能从shell进行更改。

答案 1 :(得分:1)

您可以覆盖save方法-如果不同,则在数据库中查找值并将其设置为相同。

    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)