Cleanup referenced GridFS files when a document is deleted

Note that drop_collection is not modified since there is no
guarantee that a GridFS collection holds files for only one
Document class.  Otherwise you could drop files for other fields
or documents accidentally.
This commit is contained in:
David Ignacio
2012-05-05 01:32:43 -04:00
parent 233b13d670
commit e07ecc5cf8
3 changed files with 50 additions and 0 deletions

View File

@@ -277,6 +277,11 @@ class Document(BaseDocument):
signals.pre_delete.send(self.__class__, document=self)
try:
for field_name in self._meta['proxy_fields']:
proxy_class = self._meta['proxy_fields'][field_name]
if hasattr(proxy_class, 'delete'):
proxy = getattr(self, field_name)
proxy.delete()
self.__class__.objects(pk=self.pk).delete(safe=safe)
except pymongo.errors.OperationFailure, err:
message = u'Could not delete document (%s)' % err.message
@@ -341,6 +346,13 @@ class Document(BaseDocument):
"""
cls._meta['delete_rules'][(document_cls, field_name)] = rule
@classmethod
def register_proxy_field(cls, field_name, proxy_class):
"""This method registers fields with proxy classes to delete them when
removing this object.
"""
cls._meta['proxy_fields'][field_name] = proxy_class
@classmethod
def drop_collection(cls):
"""Drops the entire collection associated with this