为什么Django的model.save()不调用full_clean()?
我只是好奇,大家有没有人知道为什么 Django 的 ORM 在模型保存的时候,除非是通过模型表单保存,否则不会自动调用 'full_clean' 方法。
注意,当你调用模型的 save() 方法时,full_clean() 不会自动被调用。如果你想对自己手动创建的模型进行一次性验证,你需要手动调用这个方法。
Django 的 full clean 文档
(注意:这个引用是针对 Django 1.6 更新的... 之前的 Django 文档也提到过关于模型表单的注意事项。)
有没有什么好的理由让人们不想要这种行为?我觉得如果你花时间给模型添加了验证,那每次保存模型的时候都应该运行这个验证才对。
我知道怎么让一切正常工作,我只是想要一个解释。
7 个回答
24
调用 full_clean
方法最简单的方法就是在你的模型里重写 save
方法:
class YourModel(models.Model):
...
def save(self, *args, **kwargs):
self.full_clean()
return super(YourModel, self).save(*args, **kwargs)
36
因为要考虑兼容性,Django的核心部分没有开启自动保存时清理的功能。
如果我们在开始一个新项目,并希望模型的默认save
方法能够自动清理,我们可以使用以下信号,在每次保存模型之前进行清理。
from django.dispatch import receiver
from django.db.models.signals import pre_save, post_save
@receiver(pre_save)
def pre_save_handler(sender, instance, *args, **kwargs):
instance.full_clean()
70
据我所知,这个问题是因为要兼容以前的版本。还有一些关于模型表单(ModelForms)中排除字段、带有默认值的模型、pre_save()信号等方面的问题。
你可能会感兴趣的资料: