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只需将它们放入我的模型声明中,一切都处理完毕)
对于模型级验证,有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