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

Aar*_*ron 141 python django django-models django-validation

我只是好奇是否有人知道django的orm是否有充分理由不在模型上调用'full_clean',除非它被保存为模型表单的一部分.

请注意,调用模型的save()方法时,不会自动调用full_clean().如果要为自己手动创建的模型运行一步模型验证,则需要手动调用它. django完全干净的文档

(注意:为Django 1.6更新了引用...以前的django文档也有关于ModelForms的警告.)

有没有充分的理由让人们不想要这种行为?我想如果你花时间为模型添加验证,那么每次保存模型时都需要运行验证.

我知道如何使一切正常工作,我只是在寻找解释.

lqc*_*lqc 56

AFAIK,这是因为向后兼容.ModelForms也存在问题,包括排除的字段,具有默认值的模型,pre_save()信号等.

您可能感兴趣的来源:

  • 第二个参考文献中最有用的摘录(恕我直言):"开发一个"自动"验证选项既简单又实用,足以处理所有边缘情况 - 如果可能的话 - 远远超过可以在1.2时间框架内完成.因此,就目前而言,Django没有任何这样的东西,并且在1.2中没有它.如果你认为你可以使它适用于1.3,你最好的办法是提案,包括至少一些示例代码,以及如何保持简单和健壮的解释." (3认同)
  • 现在这种说法已经过时了,你知道现在是否仍然如此吗? (3认同)

Alf*_*ang 28

考虑到兼容性,在django内核中未启用自动保存保存.

如果我们要启动一个新项目并希望saveModel上的默认方法可以自动清理,我们可以在保存每个模型之前使用以下信号进行清理.

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()
Run Code Online (Sandbox Code Playgroud)

  • 我看到这种方法存在两个问题1)在ModelForm的情况下,full_clean()将被调用两次:通过表单和信号2)如果表单排除某些字段,它们仍然会被信号验证. (5认同)
  • 对于那些正在使用或正在考虑使用此方法的用户:请记住,Django尚未正式支持此方法,并且在可预见的将来将不支持此方法(请参阅Django Bug Tracker中的此注释:https://code.djangoproject。 com / ticket / 29655#comment:3),因此如果启用所有模型的验证,您可能会发现一些缺陷,例如身份验证停止工作(https://code.djangoproject.com/ticket/29655)。您将不得不自己处理此类问题。但是,没有更好的atm方法。 (4认同)
  • 为什么这比在某些BaseModel上覆盖save方法(所有其他模型都将继承自该方法)先调用full_clean,然后再调用super()更好(或更糟)呢? (2认同)
  • 从 Django 2.2.3 开始,这会导致基本身份验证系统出现问题。您将收到“验证错误:具有此会话密钥的会话已存在”。为了避免这种情况,您需要为“sender in list_of_model_classes”添加一个 if 语句,以防止信号覆盖 Django 的默认身份验证模型。根据您的选择定义“list_of_model_classes” (2认同)

M.V*_*oid 11

调用full_clean方法的最简单方法是覆盖以下save方法model:

def save(self, *args, **kwargs):
    self.full_clean()
    return super(YourModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • 我看到这种方法存在两个问题1)如果ModelForm的full_clean()被调用两次:通过表单和保存2)如果表单排除某些字段,它们仍然会被保存验证. (6认同)
  • 可能最好定义一个新的 clean_save() 方法,该方法先调用 full_clean() 然后调用 save() 并在手动保存自定义模型时显式使用它? (3认同)
  • 为什么这比使用信号更好(或更差)? (2认同)