在MongoEngine中使用reverse_delete_rule时,如何使用循环或前向ReferenceField?

问题描述:

该代码炸弹:在MongoEngine中使用reverse_delete_rule时,如何使用循环或前向ReferenceField?

from mongoengine import * 

class Employee(Document): 
    name = StringField() 
    boss = ReferenceField("Employee", reverse_delete_rule = NULLIFY) 

继承人的例外:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "[…]/mongoengine/base.py", line 791, in __new__ 
    new_class = super_new(cls, name, bases, attrs) 
    File "[…]/mongoengine/base.py", line 630, in __new__ 
    f.document_type.register_delete_rule(new_class, 
    File "[…]/mongoengine/fields.py", line 757, in document_type 
    self.document_type_obj = get_document(self.document_type_obj) 
    File "[…]/mongoengine/base.py", line 136, in get_document 
    """.strip() % name) 
mongoengine.base.NotRegistered: `Employee` has not been registered 
in the document registry. 
Importing the document class automatically registers it, has it 
been imported? 

卸下reverse_delete_rule解决了这个问题,但我想有此规则。

我想这一点,和它的作品,但它确实看起来像废话,我担心可能会有不好的副作用(到目前为止,我还没有看到任何,虽然):

from mongoengine import * 

class Employee(Document): 
    pass # required for the reverse_delete_rule to work on the boss field, 
     # because the Employee class needs to exist. 

class Employee(Document): 
    name = StringField() 
    boss = ReferenceField("Employee", reverse_delete_rule = NULLIFY) 

有任何想法吗?这不应该被视为MongoEngine中的错误吗?

尝试使用'self'代替'Employee'

from mongoengine import * 

class Employee(Document): 
    name = StringField() 
    boss = ReferenceField("self", reverse_delete_rule = NULLIFY) 

查看详情:https://mongoengine-odm.readthedocs.org/en/latest/guide/defining-documents.html#reference-fields

+0

谢谢,它的作品!这解决了“自我”问题,而不是“前进”问题(如果我需要引用稍后定义的类)? – MiniQuark 2013-04-04 14:36:50

+0

对于这种情况,可能更好地使用'GenericReferenceField'(https://mongoengine-odm.readthedocs.org/en/latest/guide/defining-documents.html#generic-reference-fields)。 – tbicr 2013-04-04 15:36:24