【问题标题】:Django Rest Framework Filtering does not response 'No Data Found' when no data found找不到数据时,Django Rest Framework 过滤不响应“未找到数据”
【发布时间】:2022-01-25 15:27:34
【问题描述】:

我有一个非常简单的 DRF ListApiView,它使用 filters.SearchFilter 作为 filter_backend

但问题是,如果在查询集上没有找到数据,它会返回一个空列表。

我的代码:

serializers.py

class PhoneSerializer(serializers.ModelSerializer):
    brand_name = serializers.CharField(source='brand')

    class Meta:
        model = models.Phone
        fields = '__all__'

views.py

class PhoneApiView(generics.ListAPIView):
    filter_backends = [filters.SearchFilter]
    serializer_class = serializers.PhoneSerializer
    queryset = models.Phone.objects.all()
    search_fields = ['model_name', 'jan_code']

成功搜索的结果

[
    {
        "id": 6,
        "brand_name": "Oppo",
        "model_name": "Oppo Reno 5",
        "image": "http://127.0.0.1:8000/media/phone/reno-5-black-2.jpg",
        "colors": "Red, Blue",
        "jan_code": "785621716768184",
        "brand": 6
    }
]

如果没有找到预期的结果(当前返回一个空列表[]

    {
        "response": 'No Data Found'
    }

现在,我该怎么做? 谢谢

【问题讨论】:

    标签: python django django-rest-framework django-filter


    【解决方案1】:

    尝试从 filter_queryset() 方法开始,然后逐步使用 get() 方法。

        def filter_queryset(self, queryset):
            for backend in list(self.filter_backends):
                queryset = backend().filter_queryset(self.request, queryset, self)
            return queryset
    
        def get_queryset(self):
            return Phone.objects.all()
    
        def get(self, request):
            filtered_qs = self.filter_queryset(self.get_queryset())
    
            
            serializer = PhoneSerializer(filtered_qs, data=request.data)
            serializer.is_valid(raise_exception=True)
            if not filtered_qs.exists():
                return Response({'response': 'No Data Found'})
            return Response(serializer.data)
    

    【讨论】:

    • 是的,当没有找到数据时出现错误The response content must be rendered before it can be iterated over.
    • 我在上面编辑了我的帖子。响应现在在 get 方法而不是 filter_queryset() 方法中返回。
    • 我不知道我做错了什么,但这次正确的搜索返回了一些错误。
    • 你能发布错误信息吗?
    • validate() got an unexpected keyword argument 'raise_exception' 这是我收到的错误消息。
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 2021-06-17
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多