Files
chunyu_project/docs/ADRF_SERIALIZER_GUIDE.md
T

2.9 KiB
Raw Blame History

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 必要点(含原因)。