ORM模型的
默认构造函数如下所示(为了简洁起见,已删除文档字符串):
def _declarative_constructor(self: Any, **kwargs: Any) -> None:
cls_ = type(self)
for k in kwargs:
if not hasattr(cls_, k):
raise TypeError(
"%r is an invalid keyword argument for %s" % (k, cls_.__name__)
)
setattr(self, k, kwargs[k])
所以在其他答案中,很容易定义一个
__init__
方法来扩展
Base
。
def __init__(self, **kwargs):
super().__init__(**{k: v for k, v in kwargs.items() if hasattr(type(self), k)})
然而,我们可以通过直接替换默认构造函数来省去显式的
__init__
的需要。给定这个函数:
def lenient_constructor(self, **kwargs):
cls_ = type(self)
for k in kwargs:
if not hasattr(cls_, k):
print(f'Skipping invalid attr {k!r}')
continue
setattr(self, k, kwargs[k])
然后对于2.0之前的语法,我们可以将其设置为
Base
的默认构造函数,就像这样:
from sqlalchemy import orm
Base = orm.declarative_base(constructor=lenient_constructor)
或者像这样为2.0+版本:
from sqlalchemy import orm
registry = orm.registry(constructor=lenient_constructor)
class Base(orm.DeclarativeBase):
registry = registry