Files
chunyu_project/docs/ADRF_SERIALIZER_GUIDE.md
T

58 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 必要点(含原因)。