You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django返回单元素QuerySet时Axios response.data为空的问题求助

解决DRF接口单元素queryset返回空数组的问题

在使用Axios调用Django REST Framework (DRF)的ModelViewSet接口时,遇到以下异常:

  • 当接口返回的queryset包含多个元素时,前端能正确获取对应数量的数组数据;
  • 当queryset仅包含一个元素时,前端response.data为空数组。

已确认getQueryUrl生成的请求地址正确,重写DRF的list方法未解决问题,使用DRF默认配置。


相关代码

前端Axios代码

function useGetProducts(category: string, subcategory: string, code:string){
    const [products, setProducts] = useState<Product[]>([]);
    useEffect(() => {
        axios.get(getQueryUrl(category, subcategory, code))
            .then(response => {
                console.log(response)
                setProducts(response.data);
            })
            .catch(error => {
                console.error(error);
            });
    },[]);
    return products;
}

后端DRF代码

class ProductView(viewsets.ModelViewSet):
    serializer_class = ProductSerializer

    def get_queryset(self):
        queryset = Product.objects.all()
        cat = self.request.query_params.get('category', None)
        subcat = self.request.query_params.get('subcategory', None)
        code = self.request.query_params.get('code', None)
        if cat and subcat and code:
            queryset = queryset.filter(code__exact=code)
        elif cat and subcat:
            queryset = queryset.filter(category__exact=cat, sub_category__exact=subcat)
        elif cat:
            queryset = queryset.filter(category__exact=cat)
        print(queryset)
        return queryset

排查与解决步骤

1. 直接验证后端API输出

使用curl或Postman直接调用目标接口,查看原始响应:

curl "http://your-domain/api/products/?category=your-category&subcategory=your-subcat&code=your-code"
  • 如果后端返回空数组:问题出在后端,继续以下排查;
  • 如果后端返回单个元素的数组:检查前端是否存在响应拦截器修改数据,或response.data的结构是否被意外处理。

2. 确认queryset实际包含数据

DRF的queryset是惰性求值的,print(queryset)仅输出SQL语句,无法确认实际数据。修改get_queryset:

def get_queryset(self):
    # ... 原有过滤逻辑 ...
    # 打印实际数据而非SQL语句
    print("实际查询结果:", list(queryset))
    return queryset

查看后端控制台输出,确认是否确实存在一个Product对象。

3. 排查序列化器问题

单个元素序列化失败是常见原因,临时简化序列化器测试:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name']  # 仅保留数据库中肯定存在的字段

若此时接口正常返回单元素数组,说明原序列化器存在问题:

  • 检查是否有字段设置了required=True但对应对象中该字段为空;
  • 检查自定义to_representation或字段方法是否在单元素场景下抛出异常;
  • 检查关联字段(如ForeignKey)是否存在关联对象不存在的情况。

4. 检查分页配置

若settings.py中开启了DRF全局分页:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

此时接口返回的是分页结构而非纯数组,前端需要从response.data.results获取数据:

// 修改前端Axios回调
setProducts(response.data.results);

5. 验证参数匹配度

__exact过滤会严格匹配大小写、空格等字符,确认前端传递的参数与数据库中的值完全一致。例如数据库中category为"Electronics",前端传"electronics"会导致过滤无结果。


内容的提问来源于stack exchange,提问作者Alkid Baci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:42:48