2
2
3
3
一些 pydantic-resolve 可以使用的场景。
4
4
5
- ## 数据构建
5
+ ## 简单据构建
6
6
7
- 从多个数据源拼接数据 (同层的请求会自动并发)。
7
+ 定义一个容器结构, 然后在里面查询所需的相关数据, 比较适合面向 UI 的数据构建。
8
+
9
+ 同层的数据会自动并发查询。
8
10
9
11
``` python
10
12
from pydantic import BaseModel
11
13
from pydantic_resolve import Resolver
12
14
13
- class ReturnData (BaseModel ):
15
+ class BusinessPage (BaseModel ):
14
16
data: List[str ] = []
15
17
async def resolve_data (self ):
16
18
return await get_data()
@@ -19,45 +21,58 @@ class ReturnData(BaseModel):
19
21
async def resolve_records (self ):
20
22
return await get_records()
21
23
22
- retData = ReturnData ()
24
+ retData = BusinessPage ()
23
25
retData = await Resolver().resolve(retData)
24
26
```
25
27
26
28
## 多层数据构建
27
29
28
- 使用 dataloader 拼接多层数据, 首先提供根数据, 然后让 pydantic-resolve 拼接其他层级的数据。
30
+ 通过继承和扩展的方式, 可将普通 RESTful 的返回数据作为根数据, 然后根据定义自动获取所需的数据和后处理逻辑。
31
+
32
+ 根数据的做法可以分离业务查询逻辑和数据组合逻辑
33
+
34
+ 比如 Company 数组可能由各种查询方式获得, 比如 id, ids, 或根据字段来过滤, 但却能共享同一种组合逻辑。
35
+
36
+ 另外, 使用 dataloader 可以自动规避 N+1 查询的问题。
29
37
30
38
``` python
31
39
from pydantic import BaseModel
32
40
from pydantic_resolve import Resolver, DoaderDepend
33
41
34
- class Company (BaseModel ):
42
+ class BaseCompany (BaseModel ):
35
43
id : int
36
44
name: str
37
45
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 ):
43
47
id : int
44
48
company_id: int
45
49
name: str
46
50
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 ):
47
63
members: List[Member] = []
48
64
def resolve_members (self , loader = LoaderDepend(MemberLoader)):
49
65
return loader.load(self .id)
50
66
51
- class Member (BaseModel ):
52
- id : int
53
- office_id: int
54
- name: str
55
67
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)
61
76
```
62
77
63
78
## 对获取的数据做处理
0 commit comments