Skip to content

Instantly share code, notes, and snippets.

@Bobsans
Created January 24, 2017 10:23
Show Gist options
  • Select an option

  • Save Bobsans/fddf4a6f7adca8009460d5a544ce810b to your computer and use it in GitHub Desktop.

Select an option

Save Bobsans/fddf4a6f7adca8009460d5a544ce810b to your computer and use it in GitHub Desktop.
Django ImagedModel. Delete all linked images after model instance delete.
class ImagedModel(models.Model):
class Meta:
abstract = True
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
pre_delete.connect(self.pre_delete, self.__class__, dispatch_uid='%s_pre_delete' % str(self.__class__).lower())
def save(self, *args, **kwargs):
try:
old = self.__class__._default_manager.get(pk=self.pk)
for field in self._meta.get_fields():
if isinstance(field, FileField):
old_field = getattr(old, field.name, None)
new_field = getattr(self, field.name, None)
if new_field != old_field and not self.__class__._default_manager.filter(**{'%s__exact' % field.name: old_field}).exclude(pk=old.pk):
old_field.delete(False)
except self.__class__.DoesNotExist:
pass
except Exception as e:
print('Save %s error: %s' % (self.__class__, e))
finally:
super(ImagedModel, self).save(*args, **kwargs)
@staticmethod
def pre_delete(instance, **kwargs):
for field in instance._meta.get_fields():
if isinstance(field, FileField):
file = getattr(instance, field.name, None)
if not instance.__class__._default_manager.filter(**{'%s__exact' % field.name: file}).exclude(pk=instance._get_pk_val()):
file.delete(False)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment