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

Mongo: document from ReferenceField was deleted - how to handle DoesNotExist gracefully?

假设我有这样一个模型:

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() 并尝试检索任何在其“派对”字段中引用了 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 将修改为:

class Event(Document):
    type = StringField(required=True)
    party= ReferenceField(
        Party, required=True,
        reverse_delete_rule=mongoengine.PULL
    )

根据您的设计选择,您有两种选择:

  • mongoengine.DENY 将阻止删除引用的对象
  • mongoengine.CASCADE 将删除与引用对象关联的文档以及被引用对象。

可以在 this section of mongoengine's documentation 中找到完整的属性列表。