试图访问一个抽象类的子类的引用
问题描述:
相关的类在我的设置:试图访问一个抽象类的子类的引用
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
我试图访问的代码文档中的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
场确实有引用数组中存在的数据库文件:
任何想法是罪魁祸首?我认为这与MenuItem
是一个抽象类的事实有关,可能与此issue有关。
我跑
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