Django:只清理特定的模型字段?

时间:2016-04-04 21:33:44

标签: python django validation

我有一个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参数,但问题是我的班级有近百个不同的字段,因此排除每一个字段会有点脏。

2 个答案:

答案 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)