在模型的外部 class 方法中访问 peewee 的 Meta subclass

Access peewee's Meta subclass in Model's outer class method

我正在尝试将 peewee 模型和 classes 包装到其他界面中,我想将模型动态分配给数据库。我为此使用 peewee.Proxy class,但我不想使用全局变量来初始化此代理。我想制作 class 方法来更改基本模型的元(内部)class,但出现以下错误:

AttributeError: type object 'BaseModel' has no attribute 'Meta'

我拥有的代码:

import peewee as pw
class BaseModel(pw.Model):
    class Meta:
        database = pw.Proxy()

    @classmethod
    def configure_proxy(cls, database: pw.Database):
        cls.Meta.database.initialize(database)

当然我可以通过调用 BaseModel.Meta.database 来访问这个变量,但在我看来它不太直观。

你有什么建议吗?

我不知道你为什么会遇到这个问题,我很想知道完整的答案。

问题出在名称 Meta 上。我猜 pw.Model 中定义了同名的东西,但我还没有完全了解它。

也就是说,这个(例如)有效:

import peewee as pw
class BaseModel(pw.Model):
    class MyMeta:
        database = pw.Proxy()

    @classmethod
    def configure_proxy(cls, database: pw.Database):
        cls.MyMeta.database.initialize(database)

Peewee 在构建 class 之后将内部 "Meta" class 转换为可在 "ModelClass._meta" 访问的对象:

将“.Meta”更改为“._meta”:

class BaseModel(pw.Model):
    class Meta:
        database = pw.Proxy()

    @classmethod
    def configure_proxy(cls, database: pw.Database):
        cls._meta.database.initialize(database)