type queryset query example python django django-models

queryset - models py python



¿Cómo eliminar una imagen anterior cuando se actualiza ImageField? (5)

Antes de actualizar la instancia del modelo, puede usar el método de FileField objeto FileField . Por ejemplo, si FileField o ImageField se nombra como photo y la instancia de su modelo es profile , lo siguiente eliminará el archivo del disco

profile.photo.delete(False)

Para mayor aclaración, aquí está el django doc

https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.fields.files.FieldFile.delete

Estoy usando Django para crear un sitio de fotos, tengo un ImageField en mi modelo, el problema es que cuando el usuario actualiza el campo de imagen, el archivo de imagen original no se elimina del disco duro.

¿Cómo puedo eliminar las imágenes antiguas después de una actualización?


Aquí hay una aplicación que elimina los archivos huérfanos por defecto: django-smartfields . Eliminará archivos cuando:

  • el valor del campo fue reemplazado por uno nuevo (ya sea cargado o configurado manualmente)
  • el campo se borra a través del formulario (en caso de que ese campo no sea obligatorio, por supuesto)
  • la instancia del modelo en sí que contiene el campo se elimina.

Es posible desactivar esa función de limpieza utilizando un argumento: ImageField(keep_orphans=True) por campo, o globalmente en la configuración SMARTFIELDS_KEEP_ORPHANS = True .

from django.db import models from smartfields import fields class MyModel(models.Model): image = fields.ImageField() document = fields.FileField()


Tendrás que eliminar la imagen anterior manualmente.

La ruta absoluta a la imagen se almacena en your_image_field.name . Entonces harías algo como:

os.remove(your_image_field.name)

Pero, para su comodidad, puede usar el objeto FieldFile asociado, que le da fácil acceso al archivo subyacente, y le proporciona algunos métodos de conveniencia. Ver http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield-and-fieldfile


Use django-cleanup

pip install django-cleanup

settings.py

INSTALLED_APPS = ( ... ''django_cleanup'', # should go after your apps )


Use este método de guardado personalizado en su modelo:

def save(self, *args, **kwargs): try: this = MyModelName.objects.get(id=self.id) if this.MyImageFieldName != self.MyImageFieldName: this.MyImageFieldName.delete() except: pass super(MyModelName, self).save(*args, **kwargs)

Funciona para mí en mi sitio. Este problema también me molestaba y, en primer lugar, no quería hacer una secuencia de comandos de limpieza en lugar de una buena contabilidad. Avísame si hay algún problema con eso.