我有一个Django模型,类似于:
class MyModel(models.Model):
no_validation = models.PositiveIntegerField(null=True, db_index=True)
yes_validation = models.CharField(max_length=254, validators=[my_validator])
我还有一个预保存挂钩,类似于:
@receiver(pre_save, sender=MyModel)
def run_full_clean(sender, instance, **kwargs):
instance.clean_fields()
我的问题是,这种当前的方法可以清除所有字段。我只想清理一个特定字段(名为yes_validation的字段)。有没有一种简单的方法可以做到这一点?
我只知道exclude
参数,但问题是我的班级有近百个不同的字段,因此排除每一个字段会有点脏。
答案 0 :(得分:4)
您可以覆盖clean
方法,而不是使用clean_fields
方法。引自django docs:
Model.clean()
此方法应用于提供自定义模型 验证,并根据需要修改模型上的属性。对于 例如,您可以使用它自动为a提供值 字段,或进行需要访问多个单元的验证 字段。
我不确定这种验证方式,因为我不支持验证模型上的数据。对我来说,模型只是定义数据的数据库模式,您应该尽力验证输入源上的数据,最常用的是Form
。 Django表单具有非常好的api来验证数据,因此我建议花时间而不是使用pre_save
信号。这也可以使调试变得更容易。
答案 1 :(得分:0)
我遇到了这个问题,最终创建了一个 mixin 来选择性地清理提供的字段。
这可以通过调用 full_clean
来实现,让一个 ValidationError 被抛出并被捕获,然后只有当所选字段在错误的 error_dict
属性中时才重新引发它:
class SelectiveCleanMixin:
def full_clean(self) -> None:
"""Dummy full_clean method for type hinting."""
...
def selective_clean(self, *fields: list[str]):
"""Selectively clean the provided list of fields."""
try:
self.full_clean()
except ValidationError as exc:
errors = {k: v for (k, v) in exc.error_dict.items() if k in fields}
if errors:
raise ValidationError(errors)