我有一个模型需要一些后处理(我生成了 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。
我想知道处理此问题的最佳做法是什么。
提前致谢。
更新:
我能想到的唯一解决方案是直接调用数据库并:
- 检查
id
是否存在 - 比较
modified
和created
字段以判断它是否是编辑
最佳答案
编辑
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/