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_rule
的 mongoengine.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 中找到完整的属性列表。
假设我有这样一个模型:
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_rule
的 mongoengine.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 中找到完整的属性列表。