Skip to content

Commit d65e4c7

Browse files
committed
add model_field doc
1 parent 9bb37c3 commit d65e4c7

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

requirement.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ h11==0.14.0
99
httptools==0.6.1
1010
idna==3.6
1111
pydantic==2.5.2
12-
pydantic2-resolve==1.1.0
12+
pydantic2-resolve==1.1.3
1313
pydantic_core==2.14.5
1414
python-dotenv==1.0.0
1515
PyYAML==6.0.1
@@ -22,4 +22,4 @@ uvloop==0.19.0
2222
watchfiles==0.21.0
2323
websockets==12.0
2424
pytest==7.4.4
25-
pytest-asyncio=0.23.3
25+
pytest-asyncio==0.23.3

src/router/sample_4/readme-cn.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,31 @@ class Sample4TeamDetail(tms.Team):
6666
self.description = f'team: {self.name} has {self.task_count} tasks in total.'
6767
```
6868

69-
利用这个功能, 我们在复用相同的数据时, 可以做很多定制化的修改.
69+
利用这个功能, 我们在复用相同的数据时, 可以做很多定制化的修改.
70+
71+
72+
## 隐藏/过滤字段
73+
74+
在上个案例中, 可能会有一个疑问, 这些task_count 有一些层级, 如果我不像返回回去呢? 我想将它在返回中屏蔽掉该怎么做?
75+
76+
对于这种对外隐藏字段的需求, 可以使用 model_config 装饰器来实现.
77+
78+
```python
79+
@model_config()
80+
class Sample4StoryDetail(ss.Story):
81+
tasks: list[Sample4TaskDetail] = []
82+
def resolve_tasks(self, loader=LoaderDepend(tl.story_to_task_loader)):
83+
return loader.load(self.id)
84+
85+
task_count: int = Field(default=0, exclude=True)
86+
def post_task_count(self):
87+
return len(self.tasks)
88+
```
89+
90+
两个改动, 一个是添加了 `model_config`装饰器, 另一个是用 `Field(exclude=True)` 来申明类型.
91+
92+
在pydantic 中,如果exclude=True, 则会在输出中屏蔽该字段, 但是 schema 中依然能看到这个字段.
93+
94+
如果搭配了 `model_config` 就可以保证在 schema properties 中也屏蔽该字段.
95+
96+
可以将代码中的注释移除后测试.

src/router/sample_4/schema.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import List, Optional
2-
from pydantic2_resolve import LoaderDepend
2+
from pydantic import Field
3+
from pydantic2_resolve import LoaderDepend, model_config
34

45
import src.services.task.loader as tl
56
import src.services.user.loader as ul
@@ -17,21 +18,25 @@ class Sample4TaskDetail(ts.Task):
1718
def resolve_user(self, loader=LoaderDepend(ul.user_batch_loader)):
1819
return loader.load(self.owner_id)
1920

21+
# @model_config()
2022
class Sample4StoryDetail(ss.Story):
2123
tasks: list[Sample4TaskDetail] = []
2224
def resolve_tasks(self, loader=LoaderDepend(tl.story_to_task_loader)):
2325
return loader.load(self.id)
2426

2527
task_count: int = 0
28+
# task_count: int = Field(default=0, exclude=True)
2629
def post_task_count(self):
2730
return len(self.tasks)
2831

32+
# @model_config()
2933
class Sample4SprintDetail(sps.Sprint):
3034
stories: list[Sample4StoryDetail] = []
3135
def resolve_stories(self, loader=LoaderDepend(sl.sprint_to_story_loader)):
3236
return loader.load(self.id)
3337

3438
task_count: int = 0
39+
# task_count: int = Field(default=0, exclude=True)
3540
def post_task_count(self):
3641
return sum([s.task_count for s in self.stories])
3742

0 commit comments

Comments
 (0)