试图访问对抽象类的子类的引用

时间:2017-08-13 07:47:41

标签: mongoengine

我的设置中的相关课程:

items

我尝试使用以下代码访问文档中的 menu = Menu.objects.get(date=viewdate) print menu print menu.items 字段:

Menu object
...
File "/home/user/ll/venv/local/lib/python2.7/site-packages/mongoengine/dereference.py", line 148, in _fetch_objects
  object_map[(collection, doc.id)] = doc
AttributeError: 'MenuItem' object has no attribute 'id'

产生错误:

items

当我查看db条目时,我可以看到MenuItem字段确实有一个对数据库中存在的文档的引用数组:

items

任何想法是什么罪魁祸首?我认为它与flask-mongoengine==0.9.3 flask-restplus==0.10.1 mongoengine==0.13.0 pymongo==3.4.0 是一个抽象类,可能与此issue相关的事实有关。

我正在跑步

/

1 个答案:

答案 0 :(得分:1)

我不知道你的意思是什么,但是我运行了下面的代码片段,它工作得很好~~你最好为我们提供示例代码,让我们来重现这个bug。

from mongoengine import *
from datetime import datetime

class MenuItem(DynamicDocument):
    meta = {
        'abstract': True
    }

    @staticmethod
    def get_class_type(payload):
        if payload == 'url':
            return MenuItemURL
        elif payload == 'string':
            return MenuItemOrdinary
        raise ValueError('Unknown payload type for menu item')


class Menu(DynamicDocument):
    date = DateTimeField(required=True, unique=True)
    items = ListField(ReferenceField('MenuItem', required=True, reverse_delete_rule=CASCADE))

    def __repr__(self):
        return '<Menu %r>' % self.date


class MenuItemOrdinary(MenuItem):
    name = StringField(required=True)
    special = ListField(StringField(min_length=1, max_length=30), required=False)

    def __repr__(self):
        return '<MenuItemOrdinary %r>' % self.name


class MenuItemURL(MenuItem):
    url = URLField(required=True)

    def __repr__(self):
        return '<MenuItemURL %r>' % self.url


if __name__ == '__main__':
    host = 'mongodb://localhost:27017/demo'
    connect(host=host)
    now = datetime.now()
    m = Menu(date=now)
    m.save()
    menu = Menu.objects.get(date=now)

    print menu
    print menu.items