假设我有一个这样的模型:
class Event(Document):
type = StringField(required=True)
party= ReferenceField(Party, required=True, null=False)
我保存这样的实例:
some_party = Party.objects.first()
Event(
type='some event type',
party=some_party,
).save()
现在,如果在某个时间点我执行some_party.delete()
并尝试检索在其"party"字段中引用some_party
的任何事件,我将收到如下错误:
mongoengine.errors.DoesNotExist: Trying to dereference unknown document DBRef('party', ObjectId('62286f65088c4f1d723574c6'))
处理这种情况的巧妙方法是什么?我应该像这样保留它,也许在我的代码中加入try/except 块来检查DoesNotExist
,或者我应该以某种方式将缺少的引用转换为 None 等?
使用 mongoengine,ReferenceField 的reverse_delete_rule
属性可以解决文档删除导致一致性问题的情况。
reverse_delete_rule
的mongoengine.NULLIFY
属性将引用已删除对象的字段转换为 None。 这需要删除null=False
声明。
您的事件类将修改如下:
class Event(Document):
type = StringField(required=True)
party= ReferenceField(
Party, required=True,
reverse_delete_rule=mongoengine.PULL
)
根据您的设计选择,您有两种选择:
mongoengine.DENY
将阻止删除引用的对象mongoengine.CASCADE
将删除与引用对象以及引用对象关联的文档。
完整的属性列表可以在 mongoengine 文档的这一部分找到。