我应该在哪里对对象和字段进行django验证?

Rob*_*wen 6 python django validation django-rest-framework

我正在创建一个django应用程序,它使用Django Rest Framework和普通的django-views作为用户的入口点.

我想验证我的模型的独立字段和整体上的对象.例如:

  • 字段:输入的牌照是基于正则表达式函数的正确牌照.与其他领域无关.

  • 对象:输入的邮政编码是否对给定国家/地区有效.与模型中的邮政编码和国家/地区相关.

对于DRF-API,我使用ModelSerializers自动调用我放在模型中的所有验证器,例如:

class MyModel(models.Model):
    licence_plate = CharField(max_length=20, validators=[LicencePlateValidator])
Run Code Online (Sandbox Code Playgroud)

由于验证器是在模型中给出的,因此验证了API POSTS(因为我使用了ModelSerializer)以及在django admin后端中创建的对象.

但是,当我想引入对象级验证时,我需要在序列化程序的validate() - 方法中执行此操作,这意味着对象仅在API中进行验证.

我也必须覆盖模型的save方法,以验证在Django管理页面中创建的对象.

问题:这对我来说似乎有点乱,有一点我可以放置对象级验证器,以便它们在API和管理页面中运行,就像我在字段级验证中所做的那样(I只需将它们放入我的模型声明中,一切都处理完毕)

Iva*_*van 7

对于模型级验证,有Model.clean方法.

如果您正在使用ModelForm它(默认使用admin),则会调用它,因此这将解决django视图和管理部分.

另一方面,DRF不会clean自动调用模型,因此您必须自己进行Serializer.validate(如文档所示).你可以通过串行器mixin来做到这一点:

class ValidateModelMixin(object)
    def validate(self, attrs):
        attrs = super().validate(attrs)
        obj = self.Meta.model(**attrs)
        obj.clean()
        return attrs

class SomeModelSerializer(ValidateModelMixin, serializers.ModelSerializer):
    #...
    class Meta:
        model = SomeModel
Run Code Online (Sandbox Code Playgroud)

或写一个验证器:

class DelegateToModelValidator(object):

    def set_context(self, serializer):
        self.model = serializer.Meta.model

    def __call__(self, attrs):
        obj = self.model(**attrs)
        obj.clean()

class SomeModelSerializer(serializers.ModelSerializer):
    #...
    class Meta:
        model = SomeModel
        validators = (
            DelegateToModelValidator(),
        )
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 一个额外的模型实例化只是为了调用 clean
  • 您仍然需要将mixin/validator添加到序列化程序中