1. 组合查询数据, 处理数据¶
另一个常用的场景是拼接多个异步查询, 下面的例子假设使用异步查询返回了当前用户的所有Friend 信息:
1import asyncio
2from pydantic import BaseModel
3from pydantic_resolve import Resolver
4
5async def search_friend(name: str):
6 await asyncio.sleep(1) # search friends of tangkikodo
7 return [Friend(name="tom"), Friend(name="jerry")]
8
9class User(BaseModel):
10 name: str
11 age: int
12
13 friends: List[Friend] = []
14 async def resolve_friends(self):
15 return await search_friend(self.name)
16
17class Friend(BaseModel):
18 name: str
19
20async def main():
21 user = User(name="tangkikodo", age=20)
22 user = await Resolver().resolve(user)
23 print(user.json())
1{
2 "name": "tangkikodo",
3 "age": 19,
4 "friends": [{"name": "tom"}, {"name": "jerry"}]
5}
postponed 计算¶
当所有的resolve 方法执行完毕之后,pydantic-resolve 会执行所有 post 方法,利用这个特性,可以对获取到的数据做后续统计计算。
1import asyncio
2from pydantic import BaseModel
3from pydantic_resolve import Resolver
4
5async def search_friend(name: str):
6 await asyncio.sleep(1) # search friends of tangkikodo
7 return [Friend(name="tom"), Friend(name="jerry")]
8
9class User(BaseModel):
10 name: str
11 age: int
12
13 friends: List[Friend] = []
14 async def resolve_friends(self):
15 return await search_friend(self.name)
16
17 count: int = 0
18 def post_count(self):
19 return len(self.friends)
20
21 description: str = ''
22 def post_description(self):
23 return f'{self.name} has {len(self.friends)} friends'
24
25class Friend(BaseModel):
26 name: str
27
28async def main():
29 user = User(name="tangkikodo", age=20)
30 user = await Resolver().resolve(user)
31 print(user.json())
1{
2 "name": "tangkikodo",
3 "age": 19,
4 "friends": [{"name": "tom"}, {"name": "jerry"}],
5 "count": 2,
6 "description": "tangkikodo has 2 friends"
7}