在python SQLModel中创建dAt mixin(基类)



我使用的是SQLModel,我想定义带有created_at字段的基类,以便在其他模型中继承。

class CreatedAtMixin(SQLModel):
created_at: datetime = Field(default=datetime.now(timezone.utc), nullable=False)

但是当我尝试在其他类似的模型中使用它并通过alembic:进行迁移时

class NetworkBase(SQLModel, CreatedAtMixin):
name: str = Field(max_length=64, description='Name of network')
short_name: str = Field(max_length=32, description='Short name of the network')

我面临一个问题:

Traceback (most recent call last):
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/bin/alembic", line 8, in <module>
sys.exit(main())
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/config.py", line 588, in main
CommandLine(prog=prog).main(argv=argv)
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/config.py", line 582, in main
self.run_cmd(cfg, options)
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/config.py", line 559, in run_cmd
fn(
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/command.py", line 227, in revision
script_directory.run_env()
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/script/base.py", line 563, in run_env
util.load_python_file(self.dir, "env.py")
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/util/pyfiles.py", line 92, in load_python_file
module = load_module_py(module_id, path)
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/util/pyfiles.py", line 108, in load_module_py
spec.loader.exec_module(module)  # type: ignore
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "app/db/migrations/env.py", line 12, in <module>
from app.models import *
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/app/models/__init__.py", line 1, in <module>
from app.models.blockchain import Network
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/app/models/blockchain.py", line 9, in <module>
class NetworkBase(SQLModel, CreatedAtMixin):
File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/sqlmodel/main.py", line 277, in __new__
new_cls = super().__new__(cls, name, bases, dict_used, **config_kwargs)
File "pydantic/main.py", line 149, in pydantic.main.ModelMetaclass.__new__
File "pydantic/config.py", line 118, in pydantic.config.inherit_config
TypeError: Cannot create a consistent method resolution
order (MRO) for bases Config, Config

当然,我可以在我的NetworkBase和其他模型中手动设置字段created_at,它可以毫无问题地工作,但我想继承CreatedAtMixin

解决这个问题的方法是什么?

您需要去掉SQLModel继承,因为它已经是第一个类中的SQLModel类:

class CreatedAtMixin(SQLModel):
created_at: datetime = Field(default=datetime.now(timezone.utc), nullable=False)
class NetworkBase(CreatedAtMixin):
name: str = Field(max_length=64, description='Name of network')
short_name: str = Field(max_length=32, description='Short name of the network')

最新更新