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

Django REST Framework重写get_queryset传参到serializer触发AttributeError

报错原因
  • DRF的ListCreateAPIView要求get_queryset方法必须返回QuerySet类型的可迭代对象,你返回自定义字典不符合框架约定。默认的list响应逻辑会将get_queryset的返回值作为待序列化的数据集遍历,相当于把字典的键(字符串类型)逐个传入ParentSerializer,触发'str' object has no attribute 'main_data'错误。
  • 视图类中序列化器属性命名错误,DRF识别的序列化器配置属性是serializer_class,你定义的serializer属性不会被框架加载,也可能导致序列化逻辑异常。
  • 额外补充:MainModelSerializer的Meta类未指定fields属性,不符合DRF序列化器的编写规范,后续运行也会触发报错。
解决方案

推荐直接重写视图的list方法,手动构造符合要求的序列化数据,改动最小也符合DRF的设计逻辑,修改后的代码如下:

from rest_framework.response import Response

class MainModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MainModel
        # 按需替换为你需要序列化的字段列表
        fields = "__all__"


class ParentSerializer(serializers.Serializer):
    main_data = MainModelSerializer(many=True)
    extra_data = serializers.FloatField()
    

class MyListView(ListCreateAPIView):
    # 修正序列化器属性名
    serializer_class = ParentSerializer
    
    def get_queryset(self):
        # 这里只返回MainModel的查询集即可,符合方法约定
        return MainModel.objects.filter(/* 你的过滤条件 */)
    
    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        # 计算额外参数
        extra_data = some_calculated_value()
        # 手动构造数据传给序列化器
        serializer = self.get_serializer(instance={
            'main_data': queryset,
            'extra_data': extra_data
        })
        return Response(serializer.data)

如果需要保留POST逻辑不需要额外改动,ListCreateAPIView的create方法会自动走序列化校验逻辑,不受上述修改影响。

内容的提问来源于stack exchange,提问作者Usama Nadeem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:54:08