Django Rest Framework中的查询参数验证

17

如果给定了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个回答

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

确保始终返回一个查询集(或者如果你想这样处理的话,引发异常)。


4
应该使用exceptions.ValidationError -- 根据文档ParseError是用于解析错误的,而ValidationError则是用于格式正确但未通过验证的数据。 - connorbode
3
@connorbode 我也有同样的想法,但是当我试图从“View”中引发“ValidationError”时,它会抛出服务器500错误,显示“Validation Error at ./../”,而不是格式良好的JSON响应。我认为“ValidationError”只适用于序列化器,不确定。 - Lal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接