python - 使用 UUIDField 作为主键时如何判断模型实例是否是新的

标签 python django uuid

我有一个模型需要一些后处理(我生成了 body 字段的 MD5)。

models.py

class MyModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    body = models.TextField()
    md5 = models.CharField(max_length=32)
    ...

    def save(self, *args, **kwargs):
        if self.pk is None: # Only for create (edit disabled)
            self.md5 = get_md5(self.body)
            super(MyModel, self).save(*args, **kwargs)

问题是最后一个 block 不会执行,因为我没有看到检查实例是否是新实例的方法:self.pk 永远不会是 None 因为在保存之前填充了一个 UUID。

我想知道处理此问题的最佳做法是什么。

提前致谢。

更新:

我能想到的唯一解决方案是直接调用数据库并:

  1. 检查id是否存在
  2. 比较 modifiedcreated 字段以判断它是否是编辑

最佳答案

编辑

self.pk is never None because a UUID is populated before saving.

不是为 id 设置默认值,而是使用一种方法为新实例设置 id

class MyModel(...):
    id = models.UUIDField(primary_key=True, default=None,...)

    def set_pk(self):
        self.pk = uuid.uuid4()

    def save(self, *args, **kwargs):
        if self.pk is None:
            self.set_pk()
            self.md5 = get_md5(self.body)
            super(MyModel, self).save(*args, **kwargs)

关于python - 使用 UUIDField 作为主键时如何判断模型实例是否是新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34283205/

相关文章:

javascript - 我如何判断在 Django 中提交了这两种表单中的哪一种?

python - 如何在不使用 "for"循环的情况下遍历 Python 中的列表?

django - 反向自定义django管理网站网址?

django过滤器icontains仅匹配整个单词

arrays - Postgres - 无法加入 UUID 上的 Json 数组值

postgresql - 如何在 Ubuntu 10.04 上使用 PostgreSQL 8.4.4 生成 uuid?

python - 记忆化问题 - 房屋强盗问题

python - 如何将元素从一个列表插入到另一个列表中生成所有可能的组合

Python O(1) 成员数据访问可能吗?

python - 如何在给定范围内在python中生成UUID