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

2024-05-16 12:51:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是好奇是否有人知道django的orm之所以不在模型上调用“full_clean”,是因为它被保存为模型表单的一部分。

Note that full_clean() will not be called automatically when you call your model’s save() method. You’ll need to call it manually when you want to run one-step model validation for your own manually created models. django's full clean doc

(注:Django 1.6的报价更新。。。以前的django文档也有关于ModelForms的警告。)

人们不希望这种行为有什么好的理由吗?我认为,如果您花时间将验证添加到模型中,则希望每次保存模型时都运行该验证。

我知道如何让一切正常工作,我只是想找个解释。


Tags: todjango模型cleanyou表单yourmodel
3条回答

AFAIK,这是因为向后兼容。此外,具有排除字段的模型窗体、具有默认值的模型、pre_save()信号等也存在问题

您可能感兴趣的来源:

调用full_clean方法的最简单方法是重写model中的save方法:

def save(self, *args, **kwargs):
    self.full_clean()
    return super(YourModel, self).save(*args, **kwargs)

考虑到兼容性,django内核中没有启用保存时自动清除。

如果我们正在启动一个新项目,并且希望Model上的默认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()

相关问题 更多 >