Mongo:来自 ReferenceField 的文档被删除 - 如何优雅地处理 DoesNotExist?



假设我有一个这样的模型:

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_rulemongoengine.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 文档的这一部分找到。

最新更新