2017-08-13 62 views
1

相关的类在我的设置:试图访问一个抽象类的子类的引用

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场确实有引用数组中存在的数据库文件:

items

任何想法是罪魁祸首?我认为这与MenuItem是一个抽象类的事实有关,可能与此issue有关。

我跑

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

回答

1

我不知道你是什么意思,但我跑得片断波纹管,效果不错~~你最好为您提供的示例代码为我们跑重现错误。

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