You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:55:15