为什么Django的model.save()不调用full_clean()?

187 投票
7 回答
42907 浏览
提问于 2025-04-16 08:31

我只是好奇,大家有没有人知道为什么 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()信号等方面的问题。

你可能会感兴趣的资料:

撰写回答