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

如何为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不会触发任何写入操作,完全无验证需求。

注意事项

  1. 无需实现反序列化相关方法(如to_internal_value),因为只读场景不会处理请求数据;
  2. 后续需要扩展字段时,直接在to_representation返回的字典中添加即可;
  3. 批量序列化由DRF视图集自动处理,BaseSerializer会遍历查询集逐个执行序列化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:14:58