Подклассы документа в отдельных коллекциях в Mongoengine - PullRequest
0 голосов
/ 07 марта 2020

У меня есть коллекция в Mongoengine с длинным списком полей, которая содержит несколько документов:

class Component(Document):
    name = StringField(unique=True)
    title = StringField(required=True)
    description = StringField(default='')
    # And so on...

Теперь я хочу другую коллекцию, похожую на первую коллекцию, с некоторыми дополнительными материалами. Поэтому я использовал allow_inheritance в первой коллекции для создания подклассов:

class Component(Document):
    name = StringField(unique=True)
    title = StringField(required=True)
    description = StringField(default='')
    # And so on...
    meta = {'allow_inheritance': True}

class ChildComponent(Component):
    extra_stuff = StringField()

Но, как упоминается в документах , таким образом все данные будут сохранены в одной коллекции.

Поэтому я попытался добавить abstract к мета в родительском документе, чтобы я мог иметь две отдельные коллекции.

class Component(Document):
    name = StringField(unique=True)
    title = StringField(required=True)
    description = StringField(default='')
    # And so on...
    meta = {'allow_inheritance': True, 'abstract': True}

Но теперь, когда я пытаюсь получить документы из Component используя Component.objects().all() Я получаю эту ошибку:

AttributeError: тип объекта 'Компонент' не имеет атрибута 'objects'

Должен ли я создать базовый документ и реферат две мои коллекции из него или есть более простой способ решить эту проблему?

UPDATE

Даже если я создаю базовый класс и наследую от него оба класса:

class BaseComponent(Document):
    name = StringField(unique=True)
    title = StringField(required=True)
    description = StringField(default='')
    # And so on...
    meta = {'allow_inheritance': True, 'abstract': True}

class Component(BaseComponent):
    pass

class ChildComponent(BaseComponent):
    extra_stuff = StringField()

Когда я пытаюсь Component.objects.all(), результат будет и пустой список.

ОБНОВЛЕНИЕ 2 Если я добавлю component с .save(), я могу получить это один с Component.objects.all(). Но как насчет остальных документов, которые уже сохранены в этой коллекции? Как я могу их восстановить?

1 Ответ

0 голосов
/ 09 марта 2020

Так как я не получил ответа, я нашел способ обойти это. При использовании abstract в мета дочерние коллекции получают дополнительное поле с именем _cls с именем коллекции в качестве значения. Поэтому я использовал pymon go для обновления существующих документов с полем _cls и значением, равным названию коллекции, например:

 db["component"].update_many({}, {"$set": {"_cls": "Component"}}, upsert=False, array_filters=None)

После этого теперь я могу получать документы, используя mongoengine Component.objects().all() query.

...