Python Django Rest框架:HTTP POST和PUT的不同验证

Python Django Rest框架:HTTP POST和PUT的不同验证,python,validation,django-rest-framework,Python,Validation,Django Rest Framework,我的DataSerliazer中有一个自定义验证函数,用于检查两个参数(mrange、mthreshold)。验证功能检查过帐时是否只需要设置一个参数 class DataSerializer(serializers.ModelSerializer): emails = serializers.ListField(child = serializers.EmailField()) class Meta: model = AIData fields

我的
DataSerliazer
中有一个自定义验证函数,用于检查两个参数(mrange、mthreshold)。验证功能检查过帐时是否只需要设置一个参数

class DataSerializer(serializers.ModelSerializer):
    emails = serializers.ListField(child = serializers.EmailField())
    class Meta:
        model = AIData
        fields = ('id', 'name', 'created', 'username', 'token',
                  'expression','key','threshold' ,'evaluator', 'range','emails','metric_name', 'status')

   def validate(self,attrs):
mrange = attrs.get("metric_range")
        mthreshold  = attrs.get("metric_threshold")
    if (mrange == None or mrange == " ") and (mthreshold == None or mthreshold == " "):
            raise serializers.ValidationError({'error': 'Cannot have both range and threshold empty'})
        elif mrange != None and mthreshold != None:
            raise serializers.ValidationError({'error': 'Cannot set both range and threshold'})
在my views.py文件中

@api_view(['GET','PUT', 'DELETE'])
def ai_detail(request, token, id):
        ai = None
        try:
                ai = AIData.objects.get(id=id)
        except AIData.DoesNotExist:
                return Response(status=status.HTTP_404_NOT_FOUND)

        if request.method == 'GET':
                serializer = DataSerializer(ai)
                if serializer.data['token'] == token:
                        return Response(serializer.data)
                else:
                        return Response({'error': 'Not allowed to access'}, status=status.HTTP_400_BAD_REQUEST)

        elif request.method == 'PUT':
                serializer = AlAnotherSerializerMethod(alert, data=request.data, partial=True)
                if serializer.is_valid():
                      // updating code 

目前,我必须编写anthor
AIAnotherSerializerMethod
,这样它就不会隐式调用DataSerializer中的validate函数。这是为了避免在对象创建期间检查这两个参数。一旦创建了对象,我就不想再检查相同的函数了。有没有更整洁的方法来做同样的事情?我最好避免为同一个模型编写两个序列化程序

据我所知,rest框架库没有类似的东西

我这样做的方法是覆盖
\uuuu init\uuu
并添加您自己的变量来检查这一点

class DataSerializer(serializers.ModelSerializer):
    emails = serializers.ListField(child = serializers.EmailField())
    class Meta:
        model = AIData
        fields = ('id', 'name', 'created', 'username', 'token',
                  'expression','key','threshold' ,'evaluator', 'range','emails','metric_name', 'status')

    def __init__(self, *args, **kwargs):
        super(DataSerializer, self).__init__(*args, **kwargs)
        self._request_method = kwargs.get('request_method', 'GET')

    def validate(self,attrs):
        if self._request_method == 'GET':
            # GET logic
        elif self._request_method in ('PUT', 'POST'):
            # Put or Post logic
然后我会这样使用它:

serializer = DataSerializer(ai, request_method=request.method)
您可以传递给序列化程序,序列化程序可以包含请求本身

通过调用self.context,可以在序列化程序中的任何时间、任何地点访问上下文

此解决方案确实使提供上下文数据变得更容易,而无需覆盖
\uuuu init\uuuu