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

Mongoengine 试图访问对抽象类的子类的引用,mongoengine,Mongoengine,我的设置中的相关类: 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>

我的设置中的相关类:

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 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 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
这会产生一个错误:

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'
当我查看db条目时,我可以看到
items
字段确实有一系列对数据库中存在的文档的引用:

知道罪魁祸首是什么吗?我认为这与以下事实有关:
MenuItem
是一个抽象类,可能与此相关

我在跑步

flask-mongoengine==0.9.3
flask-restplus==0.10.1
mongoengine==0.13.0
pymongo==3.4.0

我不知道你是什么意思,但我运行了下面的代码片段,它运行得很好~~你最好提供示例代码,让我们运行以重现错误

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
来自mongoengine导入的
*
从日期时间导入日期时间
类菜单项(动态文档):
元={
“抽象”:正确
}
@静力学方法
def get_class_类型(有效负载):
如果有效负载==“url”:
返回菜单菜单菜单
elif有效负载=='string':
返回菜单异常
raise VALUERROR('菜单项的有效负载类型未知')
类菜单(动态文档):
日期=日期时间字段(必需=真,唯一=真)
items=ListField(ReferenceField('MenuItem',required=True,reverse\u delete\u rule=CASCADE))
定义报告(自我):
返回“”%self.date
类别MenuItem(MenuItem):
name=StringField(必需=True)
special=ListField(StringField(最小长度=1,最大长度=30),required=False)
定义报告(自我):
返回“%self.name”
类MenuItemURL(MenuItem):
url=URLField(必需=True)
定义报告(自我):
返回“%self.url”
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
主持人mongodb://localhost:27017/demo'
连接(主机=主机)
now=datetime.now()
m=菜单(日期=现在)
m、 保存()
menu=menu.objects.get(date=now)
打印菜单
打印菜单项
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