假設我有一個 pydantic(它可以是任何型別的)模型,它知道如何將自己轉換為 orm(它可以是任何型別的)模型。為此,我構建了 mod_a.py:
from pydantic import BaseModel
from mod2mod.mod_b import DBUser
class User(BaseModel):
name: str
surname: str
def to_orm(self) -> DBUser:
return DBUser(
full_name = f"{self.surname},{self.name}"
)
我還希望我的 orm 模型能夠將自己轉換為 pydantic 模型,所以我的 mod_b.py 是:
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String
from mod_a import User
Base = declarative_base()
class DBUser(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
full_name = Column(String)
def to_pydantic(self) -> User:
surname, name = self.full_name.split(',')
User(
name=name,
surname=surname
)
想法是能夠像在 mod2mod.py 中那樣隨意地從模型到模型:
import pydantic
from mod_a import User
from mod_b import DBUser
user = User(name='John', surname='Doe')
orm_user = user.to_orm()
pydantic_user = orm_user.to_pydantic()
print(user)
print(pydantic_user)
顯然這是行不通的,因為:
ImportError: cannot import name 'User' from partially initialized module 'mod_a' (most likely due to a circular import) (/mod2mod/mod_a.py)
如何解決此類問題?我是否需要另一個物體,現在如何在模型之間進行轉換并將當前模型方法放在那里,或者還有其他一些設計模式?
uj5u.com熱心網友回復:
你必須做一個本地import和我們TYPE_CHECKING才能做一個型別提示。
from typing import TYPE_CHECKING
from pydantic import BaseModel
if TYPE_CHECKING:
from mod2mod.mod_b import DBUser
class User(BaseModel):
name: str
surname: str
def to_orm(self) -> "DBUser":
from mod2mod.mod_b import DBUser
return DBUser(
full_name = f"{self.surname},{self.name}"
)
也這樣做DBUser。
uj5u.com熱心網友回復:
您可以使用import ...style 代替from ... import .... 并在引號中包裝回傳型別提示(我在下面這樣做)或使用延遲注釋評估PEP-563(順便說一下,它是 Python 3.10 的默認值)
# mod_a.py
from pydantic import BaseModel
import mod_b
class User(BaseModel):
name: str
surname: str
def to_orm(self) -> 'mod_b.DBUser':
return mod_b.DBUser()
# mod_b.py
import mod_a
class DBUser:
def to_pydantic(self) -> 'mod_a.User':
return mod_a.User(
name="",
surname=""
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/325579.html
標籤:蟒蛇-3.x 哎呀 设计模式 sqlalchemy 皮丹提克
