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}