ListField (ReferenceField (x)) запрос mongoengine - PullRequest
0 голосов
/ 25 июня 2019

я пытаюсь создать базу данных mongodb, код, приведенный ниже, содержит некоторые документы базы данных, я пытаюсь разделить модели на две части, часть в файле common / models.py, куда я помещаю абстрактные классы, другая часть находится на мониторе / models.py, где я добавляю несколько методов класса:

common.py:

class device(DynamicDocument):
    hostname = StringField(required=True)
    management = EmbeddedDocumentField(access)
    interfaces = ListField(ReferenceField(interface))
    loopback_addr = StringField()

    meta = {'abstract': True}



class topology(DynamicDocument):
    topology_name = StringField(required=True)
    topology_desc = StringField(required=False)
    devices = ListField(ReferenceField(device))
    links = ListField(ReferenceField(link))

    meta = {'abstract' : True}

monitor.py (методы класса не важны для этого вопроса):

from mongoengine import *
from common.models import *

class device(device):

  def connect(self):
    driver = get_network_driver("ios")
    device = None
    try:
        device =  driver(self.management.management_address,self.management.username,
                        self.management.password)
        device.open()
    except Exception as e:
        print(e)
    return device


class topology(topology):

    def do_things(self)

         pass

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

mongoengine.connect("testdb",host = "0.0.0.0", port = 27017)
topology_ins = topology.objects()[0]
for dev in topology_ins.devices:
    print(dev.hostname)

Я получаю эту ошибку:

Traceback (most recent call last):
 File "models.py", line 45, in <module>
 for dev in topology_ins.devices:
  File "/usr/lib/python3.7/site-packages/mongoengine/fields.py", line 852, in _get_
return super(ListField, self).__get__(instance, owner)
  File "/usr/lib/python3.7/site-packages/mongoengine/base/fields.py", line 282, in _get_
name=self.name
  File "/usr/lib/python3.7/site-packages/mongoengine/dereference.py", line 92, in _call_
self.object_map = self._fetch_objects(doc_type=doc_type)
  File "/usr/lib/python3.7/site-packages/mongoengine/dereference.py", line 174, in _fetch_objects
object_map[(collection, doc.id)] = doc
AttributeError: 'device' object has no attribute 'id

ошибка не возникает, если код не разделен

1 Ответ

0 голосов
/ 25 июня 2019

Некоторые внутренние компоненты mongoengine полагаются на уникальность имен классов моделей, попробуйте использовать другое имя для конкретного класса (избегайте class device(device): и class topology(topology):)

EDIT: Я смог воспроизвести вашу проблему. С моей стороны, я мог бы заставить это работать, указав allow_inheritance в meta = {'abstract': True, 'allow_inheritance': True} в обоих ваших абстрактных классах

...