# ADRF 原生异步序列化器转换规范(第二阶段:100% 异步化) ## 目标 将 serializer 层的同步 ORM 与 MethodField 全部原生异步化,消灭视图层 `sync_to_async(serializer...)` 兜底。 ## 核心 API(adrf 0.1.14) ```python # 导入替换 from rest_framework.serializers import ( ModelSerializer, Serializer, SerializerMethodField, ... ) # → 全部改为 from adrf.serializers import ( ModelSerializer, Serializer, SerializerMethodField, ... ) # adrf.serializers 同时重导出了全部异步化字段(CharField/IntegerField/... 均已支持) ``` ### 1. MethodField 异步化 ```python class XSerializer(ModelSerializer): foo = SerializerMethodField() async def get_foo(self, obj): # async def 即可,adrf.fields.SerializerMethodField 支持 count = await Related.objects.filter(x=obj).acount() return count ``` ### 2. 序列化输出 ```python # 视图中 data = await serializer.adata # 异步属性(替代 serializer.data) # 或在 adrf mixins/泛型内部使用 adrf.mixins.get_data(serializer) ``` - `adata` 内部逐字段异步调 to_representation,MethodField 异步方法会被正确 await。 - **many=True** 同样支持:`data = await serializer.adata`(ListSerializer 已被 adrf BaseSerializer.many_init 覆盖)。 - nested Serializer:嵌套的 serializer 也必须来自 adrf.serializers,否则其 .data 是同步求值。 ### 3. 写路径 ```python await serializer.asave() # 替代 sync_to_async(serializer.save) instance = await serializer.asave() # 返回 instance(同 DRF .save() 语义) # serializer.create(...) → 改写为 async def acreate(self, validated_data),内部用 await Model.objects.acreate(...) # serializer.update(...) → async def aupdate(self, instance, validated_data),内部 aget/asave/aupdate ``` - `is_valid()` 是纯 CPU 校验(无 DB 除非 validator 带查询)——保持同步调用即可;若 validators 内部有 DB 查询(如 UniqueValidator 会查库),视图侧仍需 `await sync_to_async(serializer.is_valid)()` 或改自定义 validator 为 async。**UniqueValidator 场景保留 sync_to_async 包裹 is_valid。** ### 4. 约束 - **不得**在同步方法(get_queryset、get_serializer_class、validate 等 hooks)中调用 ORM——保持现状。 - `validate(self, attrs)` 内的 DB查询(若存在)→ 改 `async def validate`(adrf 支持异步 validate?——不支持!validate 由 is_valid 同步调用。validate 内的 DB查询必须改用 CustomValidator 异步类或保留视图侧包裹)。遇到时在报告中列出。 - ModelSerializer 字段声明(fields=..., read_only_fields 等)不变。 ### 5. 每文件验证 `python -m py_compile ` 必须 0 退出。不运行服务器。 ### 6. 报告要求 逐文件列出:改动的 MethodField 数、acreate/aupdate 重写数、残留的 sync_to_async 必要点(含原因)。