58 lines
2.9 KiB
Markdown
58 lines
2.9 KiB
Markdown
# 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 必要点(含原因)。
|