Mongoengine循环参考和reverse_delete_rule:mongoengine.errors.NotRegistered

时间:2019-01-19 19:30:19

标签: python mongodb mongoengine

以下代码有一个方案和一个标签,一个方案是一个标签树。

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,一切正常。 如何解决此问题并保持正确的级联行为?

1 个答案:

答案 0 :(得分:0)

解决方案是针对引用“未注册”模型的模型删除规则,如本Github issue

中所述

使用的方法是register_delete_rule

  

此方法注册删除对象时要应用的删除规则。

在这种情况下,通过删除reverse_delete_rule=PULL声明中的Scheme并在Tag声明之后添加这一行


Tag.register_delete_rule(Scheme, "tags", PULL)