Django Rest Framework:如何将序列化数据转换为纯值列表
解决方案
有三种常见的实现方式,可根据你的业务场景选择:
方案1:重写ModelSerializer的to_representation方法
适合需要保留Serializer复用逻辑的场景,修改后序列化单条数据时直接返回字段值而非字典:
from rest_framework import serializers from .models import YourModel # 替换为你自己的模型类 class StateSerializer(serializers.ModelSerializer): class Meta: model = YourModel fields = ["state"] def to_representation(self, instance): # 仅提取目标字段值返回,不包裹字典 return super().to_representation(instance)["state"]
视图层无需额外修改,正常使用该Serializer返回列表即可得到纯字符串数组。
方案2:直接用values_list取值返回(无需Serializer)
如果没有额外的序列化校验逻辑,该方案更高效,省去序列化层的开销:
from rest_framework.response import Response from rest_framework.views import APIView from .models import YourModel class StateListView(APIView): def get(self, request): # flat=True 会直接返回单字段的可迭代对象,而非元组列表 state_list = YourModel.objects.values_list("state", flat=True) return Response(list(state_list))
方案3:通用视图重写list方法
如果使用DRF的通用视图类,可直接重写列表返回逻辑:
from rest_framework import generics from rest_framework.response import Response from .models import YourModel class StateListView(generics.ListAPIView): queryset = YourModel.objects.all() # 可保留原有过滤、分页等逻辑,仅修改返回处理 def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) state_list = queryset.values_list("state", flat=True) # 如需保留分页逻辑,可在此处加入分页处理代码 return Response(list(state_list))
注意事项
以上方案对数字、日期等其他类型的单字段返回同样适用,DRF会自动完成JSON类型转换。
内容的提问来源于stack exchange,提问作者ebarbara
相关产品推荐
相关产品推荐

