验证Django Rest Framework中的query_params

时间:2015-09-19 12:21:53

标签: python django rest django-rest-framework

我想只在给出query_params时才返回model_info,否则它应该给出一些错误信息。

我尝试了下面的代码,但是当查询参数没有传递名称时,它给了我keyerror。

from rest_framework.validators import ValidationError

class ModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelName
        fields = ('name', 'abbreviation')

    def validate_name(self, value):
        if value:
            return value
        else:
            raise ValidationError('Enter name')



class ModelNameListList(generics.ListCreateAPIView):
    renderer_classes = (JSONRenderer, )
    serializer_class = ModelSerializer

    def get_queryset(self):
        queryset = ModelName.objects.all()
        name = self.request.query_params['name']
        queryset = queryset.filter(Q(name__icontains=name) | Q(abbreviation__icontains=name)).all()
        return queryset

我不能使用get方法,因为我也使用分页,如果我将使用get方法,它将返回所有结果。

当我在get_queryset中使用下面的代码时,我得到的响应对象没有长度

   def get_queryset(self):
        queryset = ModelName.objects.all()
        name = self.request.query_params.get('name', None)
        if name:
            queryset = queryset.filter(Q(name__icontains=name) | Q(abbreviation__icontains=name)).all()
        else:
            content = {'errors': 'name is missing'}
            return Response(content)
        return queryset

1 个答案:

答案 0 :(得分:2)

使用此功能:

  def get_queryset(self):
        queryset = ModelName.objects.all()
        name = self.request.query_params.get('name', None)
        if name:
            queryset = queryset.filter(Q(name__icontains=name) | Q(abbreviation__icontains=name)).all()
        else:
            raise exceptions.ParseError("name not supplied")
        return queryset

您应该确保始终返回一个查询集(或者如果您想要处理它,则引发异常)。