Доступ к мета-подклассу peewee в методе внешнего класса Model - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь заключить peewee модели и классы в другой интерфейс и хочу динамически назначить модель для базы данных.Для этого я использую класс peewee.Proxy, но я не хочу использовать глобальную переменную для инициализации этого прокси.Я хотел сделать метод класса для изменения мета (внутреннего) класса базовой модели, но я получаю следующую ошибку:

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 голосов
/ 06 декабря 2018

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)
0 голосов
/ 06 декабря 2018

Я не знаю точно, почему у вас возникла эта проблема, и я бы заинтересовался полным ответом.

Проблема с именем 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)
...