Django序列化器如何对QuerySet仅序列化指定字段返回API响应
解决方案
这里分两种常用场景实现需求:
方案1:固定返回指定字段(最常用)
直接在你的ExampleSerializer序列化器类中声明需要返回的字段即可,这是DRF的标准用法:
from rest_framework import serializers from .models import Example class ExampleSerializer(serializers.ModelSerializer): class Meta: model = Example # 仅填写你需要返回的字段 fields = ['id', 'name', 'address']
对应修改你的list方法如下:
def list(self, request, *args, **kwargs): queryset = self.get_queryset() # 直接传入queryset即可,序列化器会自动过滤字段 serializer = ExampleSerializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK)
额外性能优化:可以在queryset后加
.only('id','name','address'),查询数据库时就只拉取指定字段,减少IO开销:queryset = self.get_queryset().only('id', 'name', 'address')
方案2:动态控制返回字段(适合多场景复用序列化器)
如果同一个序列化器需要在不同接口返回不同字段,可以重写序列化器的初始化方法支持动态传入字段列表:
class ExampleSerializer(serializers.ModelSerializer): class Meta: model = Example fields = '__all__' def __init__(self, *args, **kwargs): # 接收外部传入的字段过滤参数 include_fields = kwargs.pop('fields', None) super().__init__(*args, **kwargs) if include_fields: # 移除所有不在指定列表内的字段 allowed = set(include_fields) existing = set(self.fields.keys()) for field in existing - allowed: self.fields.pop(field)
使用时在实例化序列化器时传入需要的字段即可:
def list(self, request, *args, **kwargs): queryset = self.get_queryset() # 传入fields参数指定需要的字段 serializer = ExampleSerializer(queryset, many=True, fields=['id','name','address']) return Response(serializer.data, status=status.HTTP_200_OK)
补充说明
你之前使用的serializers.serialize是Django原生的序列化工具,不是DRF框架的组件,所以返回格式会自带model等额外字段,不符合API响应规范,正常DRF开发用上述ModelSerializer方案即可。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

