2013-06-23 23 views
1

在MongoEngine中,從包含FileField的ListField中刪除EmbeddedDocument時,引用的文件不會被刪除。目前,我已通過循環遍歷整個列表字段來解決該問題。使用來自ListField的FileField刪除EmbeddedDocument

for embdoc in doc.embdocs: 
    if embdoc.filtered == value: 
     embdoc.dfile.delete() 
doc.update(pull__embdocs={'filtered': value}) 

我想知道是否有更好的方法來做到這一點。

+0

你能展示模型嗎? –

回答

2

默認情況下,MongoDB不檢查數據的完整性,因此刪除其他文檔仍然存在引用的文檔將導致一致性問題。

您應該使用ListFieldReferenceFieldsReferenceFields可以選擇reverse_delete_rule=mongoengine.PULL或其他使用:

mongoengine.DO_NOTHING 這是默認的,不會做任何事情。刪除速度很快,但可能會導致數據庫不一致或懸空引用。

mongoengine.DENY 如果仍存在對被刪除對象的引用,則刪除被拒絕。

mongoengine.NULLIFY 任何對象的字段仍然參照對象被刪除被刪除(使用MongoDB的「unset」操作),從而有效地抵消的關係。

mongoengine.CASCADE 首先刪除包含正在引用到正被刪除的對象的字段的任何對象。

mongoengine.PULL 移除從ListField(ReferenceField)的任何對象的字段的參考對象(使用MongoDB的「拉」操作)。

+0

所以,基本上你是說,而不是使用EmbeddedDocumentField,我應該使用ReferenceField並使用另一個Collection來保存這些信息? – polandeer