验证Django Rest Framework中的query_params

Har*_*wal 9 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
Run Code Online (Sandbox Code Playgroud)

我不能使用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
Run Code Online (Sandbox Code Playgroud)

djq*_*djq 6

有了这个功能:

  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
Run Code Online (Sandbox Code Playgroud)

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

  • 可能应该是“exceptions.ValidationError”——根据[文档](http://www.django-rest-framework.org/api-guide/exceptions/#parseerror),“ParseError”是为格式错误的数据保留的,而“ ValidationError` 适用于不符合验证准则的格式正确的数据。 (4认同)
  • @connorbode我也这么想,但是当我尝试从“View”引发“ValidationError”时,它会抛出服务器500错误,显示“Validation Error at ./../”而不是格式良好的JSON响应。我认为“ValidationError”是针对序列化器的。没有把握 (3认同)