2.9 KiB
2.9 KiB
ADRF 原生异步序列化器转换规范(第二阶段:100% 异步化)
目标
将 serializer 层的同步 ORM 与 MethodField 全部原生异步化,消灭视图层 sync_to_async(serializer...) 兜底。
核心 API(adrf 0.1.14)
# 导入替换
from rest_framework.serializers import (
ModelSerializer, Serializer, SerializerMethodField, ...
)
# → 全部改为
from adrf.serializers import (
ModelSerializer, Serializer, SerializerMethodField, ...
)
# adrf.serializers 同时重导出了全部异步化字段(CharField/IntegerField/... 均已支持)
1. MethodField 异步化
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. 序列化输出
# 视图中
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. 写路径
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 <file> 必须 0 退出。不运行服务器。
6. 报告要求
逐文件列出:改动的 MethodField 数、acreate/aupdate 重写数、残留的 sync_to_async 必要点(含原因)。