@@ -83,6 +83,7 @@ class Encoder:
83
83
"""
84
84
85
85
exclude : Container [str ] = frozenset ()
86
+ include : Container [str ] = frozenset ()
86
87
custom_encoders : Mapping [type , SingleArgCallable ] = dc .field (
87
88
default_factory = dict
88
89
)
@@ -154,15 +155,39 @@ def encode(self, obj: Any) -> Any:
154
155
def _iter_model_items (
155
156
self , obj : pydantic .BaseModel
156
157
) -> Iterable [Tuple [str , Any ]]:
157
- exclude , keep_nulls = self . exclude , self .keep_nulls
158
+ keep_nulls = self .keep_nulls
158
159
get_model_field = get_model_fields (obj ).get
159
160
for key , value in obj .__iter__ ():
160
161
field_info = get_model_field (key )
161
162
if field_info is not None :
162
163
key = field_info .alias or key
163
- if key not in exclude and (value is not None or keep_nulls ):
164
+ if not self ._should_exclude_field (key , field_info ) and (
165
+ value is not None or keep_nulls
166
+ ):
164
167
yield key , value
165
168
169
+ def _should_exclude_field (
170
+ self , key : str , field_info : Optional [pydantic .fields .FieldInfo ]
171
+ ):
172
+ exclude , include = (
173
+ self .exclude ,
174
+ self .include ,
175
+ )
176
+
177
+ if key in include :
178
+ return False
179
+
180
+ is_pydantic_excluded_field = (
181
+ field_info is not None
182
+ and (
183
+ field_info .exclude
184
+ if IS_PYDANTIC_V2
185
+ else getattr (field_info .field_info , "exclude" )
186
+ )
187
+ is True
188
+ )
189
+ return key in exclude or is_pydantic_excluded_field
190
+
166
191
167
192
def _get_encoder (
168
193
obj : Any , custom_encoders : Mapping [type , SingleArgCallable ]
0 commit comments