Pydantic:遍历类的所有实例



我想遍历pydantic:

中类(服务器)的所有现有实例。
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel
from pydantic.schema import schema
class Share(BaseModel):
exportstring: str
mountpoint: str
options: str
class Server(BaseModel):
srvname: str
shares: List[Share]
class ServerList(BaseModel):
__root__: List[Server]
def __iter__(self):
return iter(self.__root__)
def __getitem__(self, Server):
return self.__root__[Server]
srv1 = Server(srvname="horst1", shares=[Share(exportstring='export1server:/vol/asdfasdf', mountpoint='/opt/bla', options='nfsvers=4,rw,sync'), Share(exportstring='export1server:/vol/blub', mountpoint='/opt/bluba', options='nfsvers=4,rw,sync')])
srv1 = Server(srvname="harry", shares=[Share(exportstring='export1server:/vol/asdfasdf', mountpoint='/opt/bla', options='nfsvers=4,rw,sync'), Share(exportstring='export1server:/vol/blub', mountpoint='/opt/bluba', options='nfsvers=4,rw,sync')])

我尝试使用这种元类serverlist,但没有成功…

像这样的东西不工作:

for item in ServerList:
print(item)

任何想法?

您可以通过编写自己的__init__,调用super的__init__将实例注册到某个注册表(这里是一个列表),然后迭代注册表来实现。

诀窍不在__init__管道。诀窍在于pydantic类创建机制(肯定在某个地方有一个元类)删除了它认为不是真正的实例级pydantic字段的任何内容。所以我不得不把server_list放在类之外。

from datetime import datetime
from typing import List, Optional, Any
from pydantic import BaseModel
from pydantic.schema import schema

class Share(BaseModel):
exportstring: str
mountpoint: str
options: str

class Server(BaseModel):
srvname: str
shares: List[Share]
#this doesn't worker.  The actual server class only gets declared
#pydantics fields and pydantic utility methods/variables.
#list : Any = []
def __init__(self, *args, **kwargs):
super(Server,self).__init__(*args,**kwargs)
server_list.append(self)
#have to declare standalone variable, or at least one outside
#of pydantic class definitions
server_list = []

srv1 = Server(srvname="horst1", shares=[Share(exportstring='export1server:/vol/asdfasdf', mountpoint='/opt/bla', options='nfsvers=4,rw,sync'), Share(exportstring='export1server:/vol/blub', mountpoint='/opt/bluba', options='nfsvers=4,rw,sync')])
srv2 = Server(srvname="harry", shares=[Share(exportstring='export1server:/vol/asdfasdf', mountpoint='/opt/bla', options='nfsvers=4,rw,sync'), Share(exportstring='export1server:/vol/blub', mountpoint='/opt/bluba', options='nfsvers=4,rw,sync')])
#hardcoded iteration
for srv in [srv1,srv2]:
print(f"nn{srv=}")
# for srv2 in Server.list:
#registered by class 
for srv2 in server_list:
print(f"nn{srv2=}")
输出:


srv=Server(srvname='horst1', shares=[Share(exportstring='export1server:/vol/asdfasdf', mountpoint='/opt/bla', options='nfsvers=4,rw,sync'), Share(exportstring='export1server:/vol/blub', mountpoint='/opt/bluba', options='nfsvers=4,rw,sync')])

srv=Server(srvname='harry', shares=[Share(exportstring='export1server:/vol/asdfasdf', mountpoint='/opt/bla', options='nfsvers=4,rw,sync'), Share(exportstring='export1server:/vol/blub', mountpoint='/opt/bluba', options='nfsvers=4,rw,sync')])

srv2=Server(srvname='horst1', shares=[Share(exportstring='export1server:/vol/asdfasdf', mountpoint='/opt/bla', options='nfsvers=4,rw,sync'), Share(exportstring='export1server:/vol/blub', mountpoint='/opt/bluba', options='nfsvers=4,rw,sync')])

srv2=Server(srvname='harry', shares=[Share(exportstring='export1server:/vol/asdfasdf', mountpoint='/opt/bla', options='nfsvers=4,rw,sync'), Share(exportstring='export1server:/vol/blub', mountpoint='/opt/bluba', options='nfsvers=4,rw,sync')])

最新更新