使用Pydantic生成JSON时,如何过滤transfers列表中的空字典?
解决Pydantic生成JSON时保留非空字典项的问题
我之前处理Dataframe转Pydantic模型的时候也碰到过一模一样的问题,那些全为None的空字典确实很烦人。你试过的方法没起效,主要是因为exclude_unset=True和exclude_defaults=True只负责移除单个字典里的空字段,不会删除整个空字典元素。下面给你几个亲测有效的方案:
方案1:先过滤Dataframe里的全空行
在把Dataframe转成Pydantic模型之前,先把所有字段都是NaN/None的行删掉,从源头解决问题:
# 过滤所有字段都为空的行 filtered_df = df.dropna(how='all') # 再把过滤后的df转成字典列表传入模型 transfers_data = filtered_df.to_dict('records')
这个方法最直接,因为如果行本身全空,根本没必要让它进入后续的模型处理流程。
方案2:在Pydantic模型序列化时过滤空字典
如果不想修改原始Dataframe,可以在模型的序列化逻辑里手动过滤transfers列表中的空项。以Pydantic v2为例:
from pydantic import BaseModel, Field from typing import List, Optional class Transfer(BaseModel): id: Optional[int] = None amount: Optional[float] = None date: Optional[str] = None class MainModel(BaseModel): transfers: List[Transfer] = Field(default_factory=list) def model_dump(self, **kwargs): # 先获取每个Transfer的序列化结果,再过滤全空的项 filtered_transfers = [] for transfer in self.transfers: transfer_dict = transfer.model_dump(**kwargs) # 检查字典是否有非None的字段 if any(value is not None for value in transfer_dict.values()): filtered_transfers.append(transfer_dict) # 替换原有的transfers列表 result = super().model_dump(**kwargs) result['transfers'] = filtered_transfers return result # 生成JSON的时候直接调用model_dump_json() json_output = main_model.model_dump_json(indent=2)
如果是Pydantic v1,把model_dump换成dict,model_dump_json换成json()就行。
方案3:预处理字典列表再传入模型
如果你的流程是先把Dataframe转成字典列表,那可以先对这个列表做过滤:
# 从Dataframe获取原始字典列表 transfers_data = df.to_dict('records') # 过滤掉所有值都是None的字典 filtered_transfers = [ item for item in transfers_data if any(val is not None for val in item.values()) ] # 再把过滤后的列表传给Pydantic模型 main_model = MainModel(transfers=filtered_transfers)
这三个方案里,我个人推荐方案1,因为从源头过滤最省性能,也最直观。如果因为业务原因不能修改原始Dataframe,方案2或者3都能解决问题。
内容的提问来源于stack exchange,提问作者Vitor Assuena
相关产品推荐
相关产品推荐

