ListField(ReferenceField(x))查询mongoengin

2024-05-28 19:18:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个mongodb数据库,下面的代码中有一些数据库文档,我正在尝试将模型分为两部分,一部分是公共的/型号.py我把抽象类放在文件里,另一部分放在监视器上/型号.py在这里我添加了一些类方法:

你知道吗普通.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}

你知道吗监视器.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

代码未被分割时不会发生错误


Tags: inpyselftruegetdeviceusrline
1条回答
网友
1楼 · 发布于 2024-05-28 19:18:26

mongoengine的一些内部结构依赖于模型类名的唯一性,请尝试为具体类使用不同的名称(避免class device(device):class topology(topology):

编辑: 我能重现你的问题。在我这边,我可以通过在两个抽象类的meta = {'abstract': True, 'allow_inheritance': True}中指定allow_inheritance来实现

相关问题 更多 >

    热门问题