如何为Django ReadOnlyViewSet创建高性能序列化器替代方案?
Django REST Framework 只读场景下高性能自定义序列化器实现
我发现即便解决了N+1查询问题,Django Serializers的性能还是很差,这是实践和相关问题总结出来的结论。
当前我的用户模型视图集代码如下:
from django.contrib.auth.models import User from rest_framework.viewsets import ReadOnlyModelViewSet class UserViewSet(ReadOnlyModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer filterset_fields = {'groups__name': ['exact', 'in']}
我已经有一个自定义序列化函数:
def serialize_user_only_fields_I_care(user_instance): return { 'name': user_instance.first_name, 'last_name': user_instance.last_name, 'username': user_instance.username, }
请问如何编写自定义序列化器类,能直接设置为serializer_class = MyUserSerializer使用,并且跳过验证等不必要的步骤?因为是只读场景,我认为验证没必要,但可能有遗漏的点。
解决方案
完全自定义只读序列化器
要实现跳过验证、高性能的只读序列化器,直接继承DRF的BaseSerializer,仅实现to_representation方法即可——这是序列化器将模型实例转为字典的核心逻辑,能彻底跳过ModelSerializer自动字段映射、验证、类型转换等冗余步骤。
方案1:直接实现逻辑
from rest_framework import serializers class MyUserSerializer(serializers.BaseSerializer): def to_representation(self, instance): return { 'name': instance.first_name, 'last_name': instance.last_name, 'username': instance.username, }
方案2:复用已有序列化函数
from rest_framework import serializers def serialize_user_only_fields_I_care(user_instance): return { 'name': user_instance.first_name, 'last_name': user_instance.last_name, 'username': user_instance.username, } class MyUserSerializer(serializers.BaseSerializer): def to_representation(self, instance): return serialize_user_only_fields_I_care(instance)
性能优势说明
- 跳过
ModelSerializer自动生成字段、字段验证、数据类型转换等一系列非必要流程; - 直接读取模型实例属性生成字典,逻辑极简,性能接近原生Python字典转换;
- 适配只读场景:
BaseSerializer默认未实现create/update方法,搭配ReadOnlyModelViewSet不会触发任何写入操作,完全无验证需求。
注意事项
- 无需实现反序列化相关方法(如
to_internal_value),因为只读场景不会处理请求数据; - 后续需要扩展字段时,直接在
to_representation返回的字典中添加即可; - 批量序列化由DRF视图集自动处理,
BaseSerializer会遍历查询集逐个执行序列化逻辑。
内容的提问来源于stack exchange,提问作者evan54
相关产品推荐
相关产品推荐

