只创建非空/非空字典的列表



我正在Pydantic中创建一个模型,以从数据框架中获得类似json的格式。

目前我得到的是:

from datetime import datetime
from pydantic import BaseModel
from typing import Optional, List, Deque, Union
from collections.abc import Sequence
class startDate (BaseModel):
year: int
month: int
day: int
class endDate (BaseModel):
year: int
month: int
day: int
class origin(BaseModel):
id: str
class destinations(BaseModel):
id: Optional[str] = None

class transfers_list(BaseModel):
unloadingDuration: Optional[str] = None
destination: Optional[destinations] = None
class frequency(BaseModel):
id: str
class routeDetails (BaseModel):
arrivalTime: str
loadingStartTime: str
loadingDuration: str
releaseVehicleDuration: str
vehicleType: str
carrierId: str
returnRoute: bool
dock: Optional[str]
origin: origin
transfers: Optional[list[transfers_list]] = None
frequency: frequency

class main (BaseModel):
region: str
startDate: startDate
endDate: endDate
recurrenceDays: list[int]
routeDetails: routeDetails

class head (BaseModel):
recurrenceSchedule: main

m = main(region='ABC',
startDate={'year': 2023,
'month': 1,
'day': 1},
endDate={'year': 2023,
'month': 1,
'day': 1},
recurrenceDays=[5],
routeDetails = {'arrivalTime':'09:00:00',
'loadingStartTime':'09:00:00',
'loadingDuration':'09:00:00',
'releaseVehicleDuration':'09:00:00',
'vehicleType':"truck",
'carrierId':"carrier_name",
'returnRoute':True,
'dock': None,
'origin': origin(id="NYC"),
'transfers': [transfers_list(unloadingDuration='10s', destination=destinations(id='id_destination')),transfers_list(unloadingDuration=None, destination=destinations(id=None))],
'frequency': frequency(id='247') 
}
)

final = (head(recurrenceSchedule = m))
final = final.json(exclude_unset=True,exclude_defaults=True)
print(final)

输出如下:

{
"recurrenceSchedule":{
"region":"ABC",
"startDate":{
"year":2023,
"month":1,
"day":1
},
"endDate":{
"year":2023,
"month":1,
"day":1
},
"recurrenceDays":[
5
],
"routeDetails":{
"arrivalTime":"09:00:00",
"loadingStartTime":"09:00:00",
"loadingDuration":"09:00:00",
"releaseVehicleDuration":"09:00:00",
"vehicleType":"truck",
"carrierId":"carrier_name",
"returnRoute":true,
"origin":{
"id":"NYC"
},
"transfers":[
{
"unloadingDuration":"10s",
"destination":{
"id":"id_destination"
}
},
{
"destination":{

}
}
],
"frequency":{
"id":"247"
}
}
}
}

这几乎正是我所需要的,但在我的Dataframe中,我有其他列用于卸载duration和Destination,它们位于"Transfers"内部。然而,当DF中的值为空/null/None时,我不想在列表中添加另一个字典。我想要的输出是:

"transfers":[
{
"unloadingDuration":"10s",
"destination":{
"id":"id_destination"
}
}
]

而不是:

"transfers":[
{
"unloadingDuration":"10s",
"destination":{
"id":"id_destination"
}
},
{
"destination":{

}
}
]

我已经尝试改变我的NaN字段(unloadingDuration和destination)在数据框架为None,但这不起作用。

我试着将一些类来回更改为可选,这似乎也不起作用。

我还使用了exclude_unset=Trueexclude_defaults = True在某些情况下确实有效(dock是可选的,当我将其设置为null时,它根本不会显示)。

尝试排除none值:

final = final.json(exclude_unset=True, exclude_none=True)