Добавьте те же поля и методы в класс EmbededDocument и Document в mongoengine. - PullRequest
0 голосов
/ 19 мая 2018

Я хочу добавить поля, связанные с отметкой времени, как в унаследованные документы класса EmbededDocument, так и в унаследованные документы обычного класса Document.

Поскольку классы EmbededDocument и Document не могут быть смешаны в mongoengine, мне пришлось создать базовый класс и попытаться использовать его с помощью множественного наследования.

Это то, что я сделал

class SikkaBase():
    # Passing a callable as default
    created_on = DateTimeField(default=datetime.now)
    updated_on = DateTimeField(default=datetime.now)
    is_deleted = BooleanField(default=False)

    # Update the updated_on field for every update
    def update(self, *args, **kwargs):
        self.updated_on = datetime.now()

        super(SikkaBase, self).save(*args, **kwargs)

    # Update the created_on field for every updates
    def save(self, *args, **kwargs):
        self.updated_on = datetime.now()

        super(SikkaBase, self).save(*args, **kwargs)


class SikkaBaseDocument(Document, SikkaBase):
    meta = {
        'abstract': True
    }

class SikkaEmbededBaseDocument(EmbeddedDocument, SikkaBase):
    meta = {
        'abstract': True
    }

Это выдает ошибку

 File ".../sikka_env/lib/python2.7/site-packages/mongoengine/base/metaclasses.py", line 305, in __new__
    if b.__class__ == TopLevelDocumentMetaclass]
AttributeError: class SikkaBase has no attribute '__class__'

Я не уверен в своем решении, так как класс SikkaBase не связан сMongoEngine в любом случае, не уверен, насколько это актуально.

Ищем любые возможные решения.Я всегда могу скопировать один и тот же код в классы SikkaBaseDocument и SikkaEmbededBaseDocument, но хочу избежать того же.

1 Ответ

0 голосов
/ 29 мая 2018

Похоже, классы старого стиля не имеют атрибута __class__, поэтому вы должны наследовать от object.Изменение первой строки с

class SikkaBase():

на

class SikkaBase(object):

должно решить эту проблему.

...