如何在Pydantic模型中排除指定字段参与哈希与相等性比较?
如何在Pydantic模型中排除指定字段参与哈希与相等性比较?
嘿,这个需求刚好可以用Pydantic自带的配置来解决,完全不用自己手动重写__hash__和__eq__方法!我给你分版本说下具体怎么做:
如果你用的是Pydantic v2(当前主流版本)
直接在模型的配置里指定要排除的字段就行,Pydantic会自动帮你处理相等性比较和哈希计算,而且这个字段依然会保留在实例里,序列化到JSON的时候也能正常输出,完全符合你的要求。
修改后的模型代码如下:
from datetime import datetime as dt from pydantic import BaseModel class TafReport(BaseModel, frozen=True): download_date: dt icao: str issue_time: dt validity_time_start: dt validity_time_stop: dt raw_report: str model_config = { "equality_exclude": {"download_date"} }
设置好之后,哪怕两个TafReport实例的download_date不一样,只要其他字段完全相同,Pydantic就会把它们视为相等的对象,哈希值也会一致。这时候你直接用tafs = list(set(tafs))来去重,就能得到去重后的结果了。
如果你还在使用Pydantic v1
可以给要排除的字段加上compare=False的参数,同样能让它不参与相等性和哈希计算,同时保留字段的其他功能:
from datetime import datetime as dt from pydantic import BaseModel, Field class TafReport(BaseModel, frozen=True): download_date: dt = Field(..., compare=False) icao: str issue_time: dt validity_time_start: dt validity_time_stop: dt raw_report: str
这样配置后,效果和v2的方案一样,不用你自己写任何魔法方法,直接用set去重就可以了。
备注:内容来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

