Python使用args和kwargs来验证序列化程序

时间:2018-04-09 05:25:32

标签: python django django-rest-framework

我正在构建这个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')

在序列化器内部,但每个序列化器有几个这样的验证。所以我正在寻找一种方法,我可以使用一个函数进行所有这些验证。我正在考虑使用argskwargs,但不知道如何继续。 我想的是:

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'的验证。有没有办法只使用一个常用功能来实现这一目的? 请任何想法。提前谢谢。

1 个答案:

答案 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' ) ,并将验证逻辑保存在一个位置。