feat: ADRF async views (phase1) + native async serializers (phase2) + async cache infra

This commit is contained in:
async-upgrade
2026-09-06 14:26:17 +08:00
parent 9a6577f71e
commit 8f488fcaaa
55 changed files with 2224 additions and 1513 deletions
+57
View File
@@ -0,0 +1,57 @@
# 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 <file>` 必须 0 退出。不运行服务器。
### 6. 报告要求
逐文件列出:改动的 MethodField 数、acreate/aupdate 重写数、残留的 sync_to_async 必要点(含原因)。