【发布时间】:2016-03-20 21:19:13
【问题描述】:
我有一个模型需要一些后处理(我生成了 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)
问题是最终块不会执行,因为我看不到检查实例是否是新实例的方法:self.pk 永远不是None,因为在保存之前填充了 UUID。
我想知道处理这个问题的最佳做法是什么。
提前致谢。
更新:
我能想到的唯一解决办法就是直接调用数据库:
- 检查
id是否存在 - 比较
modified和created字段来判断它是否是编辑
【问题讨论】:
-
所以,
self.md5是一个新实例的None,对吧?那为什么不用self.md5代替self.pk呢? -
我可以做到这一点,但还会发生其他一些事情(另一个模型使用 FK 创建回这个模型)。不幸的是,我忽略了将其添加到这个简单的示例中:/
-
作为可能的解决方案,您可以尝试使用保存后信号。它包含布尔标志 - 已创建。但是这种方法会向 db 添加额外的查询。