2013-06-23 9 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는 데이터의 무결성을 검사하지 않으므로 다른 문서가 계속 참조를 보유하고있는 문서를 삭제하면 일관성 문제가 발생할 수 있습니다.

ListFieldReferenceFields을 사용해야합니다. ReferenceFields 옵션 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