我正在构建这个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'
的验证。有没有办法只使用一个常用功能来实现这一目的?
请任何想法。提前谢谢。
答案 0 :(得分:1)
您可以执行以下操作:
模型
merged_data_nB = merged_data[merged_data['BASE'] != 'B']
merged_data_nS = merged_data[merged_data['BASE'] != 'S']
def f_B(x):
x['Check_B'] = (x['END'].isin(x['START']) & x['BASE'].isin(['B','T','X'])& (x['END'] != x['START'])).astype(int)
return x
def f_S(x):
x['Check_S'] = (x['END'].isin(x['START']) & x['BASE'].isin(['S','T','X'])& (x['END'] != x['START'])).astype(int)
return x
abcd_B = merged_data_nS.groupby(['SECTOR']).apply(f_B)
abcd_S = merged_data_nB.groupby(['SECTOR']).apply(f_S)
result1 = abcd_B.join(abcd_S, how='outer', lsuffix='_B', rsuffix='_S')
混入
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'
)
,并将验证逻辑保存在一个位置。