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
相关产品推荐
相关产品推荐

