Skip to content

Commit 9667f9c

Browse files
committed
update use_case (wip)
1 parent 3d494aa commit 9667f9c

File tree

1 file changed

+35
-20
lines changed

1 file changed

+35
-20
lines changed

docs/use_case.zh.md

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22

33
一些 pydantic-resolve 可以使用的场景。
44

5-
## 数据构建
5+
## 简单据构建
66

7-
从多个数据源拼接数据 (同层的请求会自动并发)。
7+
定义一个容器结构, 然后在里面查询所需的相关数据, 比较适合面向 UI 的数据构建。
8+
9+
同层的数据会自动并发查询。
810

911
```python
1012
from pydantic import BaseModel
1113
from pydantic_resolve import Resolver
1214

13-
class ReturnData(BaseModel):
15+
class BusinessPage(BaseModel):
1416
data: List[str] = []
1517
async def resolve_data(self):
1618
return await get_data()
@@ -19,45 +21,58 @@ class ReturnData(BaseModel):
1921
async def resolve_records(self):
2022
return await get_records()
2123

22-
retData = ReturnData()
24+
retData = BusinessPage()
2325
retData = await Resolver().resolve(retData)
2426
```
2527

2628
## 多层数据构建
2729

28-
使用 dataloader 拼接多层数据, 首先提供根数据, 然后让 pydantic-resolve 拼接其他层级的数据。
30+
通过继承和扩展的方式, 可将普通 RESTful 的返回数据作为根数据, 然后根据定义自动获取所需的数据和后处理逻辑。
31+
32+
根数据的做法可以分离业务查询逻辑和数据组合逻辑
33+
34+
比如 Company 数组可能由各种查询方式获得, 比如 id, ids, 或根据字段来过滤, 但却能共享同一种组合逻辑。
35+
36+
另外, 使用 dataloader 可以自动规避 N+1 查询的问题。
2937

3038
```python
3139
from pydantic import BaseModel
3240
from pydantic_resolve import Resolver, DoaderDepend
3341

34-
class Company(BaseModel):
42+
class BaseCompany(BaseModel):
3543
id: int
3644
name: str
3745

38-
offices: List[Office] = []
39-
def resolve_offices(self, loader=LoaderDepend(OfficeLoader)):
40-
return loader.load(self.id)
41-
42-
class Office(BaseModel):
46+
class Baseffice(BaseModel):
4347
id: int
4448
company_id: int
4549
name: str
4650

51+
class BaseMember(BaseModel):
52+
id: int
53+
office_id: int
54+
name: str
55+
56+
# ------- composition ----------
57+
class Company(BaseCompany):
58+
offices: List[Office] = []
59+
def resolve_offices(self, loader=LoaderDepend(OfficeLoader)):
60+
return loader.load(self.id)
61+
62+
class Office(BaseOffice):
4763
members: List[Member] = []
4864
def resolve_members(self, loader=LoaderDepend(MemberLoader)):
4965
return loader.load(self.id)
5066

51-
class Member(BaseModel):
52-
id: int
53-
office_id: int
54-
name: str
5567

56-
companies = [
57-
Company(id=1, name='Aston'),
58-
Compay(id=2, name="Nicc"),
59-
Company(id=3, name="Carxx")]
60-
companies = await Resolver().resolve(companies)
68+
raw_companies = [
69+
BaseCompany(id=1, name='Aston'),
70+
BaseCompany(id=2, name="Nicc"),
71+
BaseCompany(id=3, name="Carxx")]
72+
73+
companies = [Company.model_validate(c, from_attributes=True) for c in raw_companies]
74+
75+
data = await Resolver().resolve(companies)
6176
```
6277

6378
## 对获取的数据做处理

0 commit comments

Comments
 (0)