У меня есть коллекция в 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()
. Но как насчет остальных документов, которые уже сохранены в этой коллекции? Как я могу их восстановить?