以下代码有一个方案和一个标签,一个方案是一个标签树。
from mongoengine import *
class Scheme(Document):
#_id = None # provided by mongodb
name = StringField(max_length=120, required=True)
tags = ListField(ReferenceField('Tag', reverse_delete_rule=PULL))
class Tag(Document):
name = StringField(max_length=120)
annotation_scheme = ReferenceField('Scheme', reverse_delete_rule=CASCADE)
subtags = ListField(ReferenceField('self', reverse_delete_rule=PULL))
parent = ReferenceField('self', reverse_delete_rule=CASCADE)
线
tags = ListField(ReferenceField('Tag', reverse_delete_rule=PULL))
导致错误:
mongoengine.errors.NotRegistered: `Tag` has not been registered in the document registry.
请注意,如果我删除reverse_delete_rule=PULL
,一切正常。
如何解决此问题并保持正确的级联行为?
答案 0 :(得分:0)
解决方案是针对引用“未注册”模型的模型删除规则,如本Github issue
中所述使用的方法是register_delete_rule
此方法注册删除对象时要应用的删除规则。
在这种情况下,通过删除reverse_delete_rule=PULL
声明中的Scheme
并在Tag
声明之后添加这一行
Tag.register_delete_rule(Scheme, "tags", PULL)