2013-06-23 1 views
1

В MongoEngine при удалении EmbeddedDocument из ListField, который включает FileField, ссылочный файл не удаляется. В настоящее время я решил проблему, перейдя по всему полю списка.Удаление EmbeddedDocument с FileField из ListField

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

Мне было интересно, был ли лучший способ сделать это.

+0

Можете ли вы показать модель? –

ответ

2

По умолчанию MongoDB не проверяет целостность ваших данных, поэтому удаление документов, на которые ссылаются другие документы, приведет к проблемам согласованности.

Вы должны использовать ListField с ReferenceFields. ReferenceFields может использоваться с опцией reverse_delete_rule=mongoengine.PULL или иначе:

mongoengine.DO_NOTHING Это значение по умолчанию и ничего не будет делать. Удаления выполняются быстро, но могут приводить к несогласованности базы данных или зависанию ссылок.

mongoengine.DENY Исключено, если все еще существуют ссылки на удаляемый объект.

mongoengine.NULLIFY полей Любой объект, по-прежнему со ссылкой на объект удаляется, удаляются (с использованием «unset» операцию MongoDB в), эффективно сводит на нет отношения.

mongoengine.CASCADE Любой объект, содержащий поля, которые к Ссылающиеся объекта удаляются, удаляются первым.

mongoengine.PULL Удаляет ссылку на объект (с помощью «тянуть» операцию MongoDB в) из полей любого объекта из ListField (ReferenceField).

+0

Итак, в основном вы говорите, что вместо использования EmbeddedDocumentField я должен использовать ReferenceField и использовать другую коллекцию для хранения этой информации? – polandeer