【问题标题】:Why is Django UUIDField with editable=False is editable?为什么带有editable = False的Django UUIDField是可编辑的?
【发布时间】:2019-03-13 19:06:12
【问题描述】:

我想让 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

【问题讨论】:

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


    【解决方案1】:

    查看editable field 的文档。

    如果为 False,该字段将不会显示在 admin 或任何其他 模型形式。在模型验证期间它们也会被跳过。默认为 没错。

    这并不意味着不能从外壳更改。

    【讨论】:

      【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2012-07-18
        • 1970-01-01
        • 2015-05-31
        • 2016-12-13
        • 2022-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-10
        相关资源
        最近更新 更多