好吧,我正在构建这个django rest api,我的用户可以在其中发送一些数据,并将它们保存到数据库中。在那里,我需要在将他们发送的数据保存到数据库之前对其进行验证。
我已经添加了验证器,例如,
def validate(self, value):
UnitOfMeasureName = ["Each", "Grams", "Ounces", "Pounds", "Kilograms", "Metric Tons"]
if value in UnitOfMeasureName:
return True
else:
return ValidationError('Invalid')
在序列化程序内部,但每个序列化程序都需要实现多个这样的验证。所以我正在寻找一种可以使用一个函数进行所有这些验证的方法。我正在考虑使用args
和kwargs
但不知道如何进行。我在想这样的事情:
def validate_all(*args, **kwargs):
if not validation_1:
validation_error = {add the error messsage to the dic}
if not validation_2:
...
if not validation_3:
...
return validation_error
示例序列化程序:
class TransSerializer(serializers.ModelSerializer):
def validate(self, data):
if not data['unitofmeasurename'] in UnitOfMeasureName:
raise serializers.ValidationError("INVALID")
return data
class Meta:
model = Trans
fields = ('unitofmeasurename','name')
因此,在另一个序列化程序中,我需要检查'unitofmeasurename'
和'name'
的验证。有没有办法只使用一个通用函数来实现这一点?请有任何想法。提前谢谢。
你可以执行以下操作:
模型
from your_app.mixins import ValidationMixin
class YourSerializer(ModelSerializer, ValidationMixin):
def create(self, validated_data):
# First check
self.raise_if_something_wrong(validated_data['value'])
# Second check
self.get_object_if_exist(validated_data['title'])
# This will happen ONLY if your previous check's were ok
your_model = YourModel.objects.create(
**validated_data
)
return your_model
混入
from django.conf import settings
from rest_framework.serializers import ValidationError
class ValidationMixin:
def raise_if_something_wrong(self, value):
if value not in settings.UNIT_OF_MEASURE_NAME:
raise ValidationError(
'Invalid'
)
else:
pass
def get_object_if_exist(self, obj_title):
try:
return YourModel.objects.get(title=obj_title)
except YourModel.DoesNotExist:
raise ValidationError(
'Cant get that object'
)
设置
还可以将其添加到项目的主settings.py
文件中,将其保留为元组:
UNIT_OF_MEASURE_NAME = (
'Each',
'Grams',
'Ounces',
'Pounds',
'Kilograms',
'Metric Tons'
)
因此,您将能够在要验证数据的任何地方使用ValidationMixin
,并将验证逻辑保存在一个位置。