【问题标题】:Django Rest Framework: Different Validations for HTTP POST and PUTDjango Rest Framework:HTTP POST 和 PUT 的不同验证
【发布时间】:2016-01-05 18:42:25
【问题描述】:

我的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'})

在我的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 中的验证函数。这是为了避免在对象创建期间检查 2 个参数。创建对象后,我不想再检查相同的功能。有没有更简洁的方法来做同样的事情?我最好避免为同一模型编写 2 个序列化程序。

【问题讨论】:

    标签: python validation django-rest-framework


    【解决方案1】:

    您可以将context data 传递给可以包含请求本身的序列化程序。

    您可以通过调用 self.context 随时随地在序列化程序中访问上下文。

    此解决方案确实可以更轻松地提供上下文数据,而无需覆盖 __init__

    【讨论】:

      【解决方案2】:

      据我所知,rest-framework 库没有类似的东西。

      我这样做的方法是覆盖 __init__ 并添加您自己的变量来检查这一点。

      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)
      

      【讨论】:

        猜你喜欢
        • 2016-06-01
        • 2013-03-30
        • 1970-01-01
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        相关资源
        最近更新 更多