在Model的外部类方法中访问peewee的Meta子类

时间:2018-12-05 21:43:09

标签: python python-3.x peewee

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

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来访问此变量,但我认为它不太直观。

您有任何建议吗?

2 个答案:

答案 0 :(得分:0)

我不知道您为什么会遇到这个问题,我对完整答案很感兴趣。

问题出在名字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)

答案 1 :(得分:0)

在构建类之后,Peewee将内部的“ Meta”类转换为可在“ 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)