Soft delete en django con django-paranoid

Posted by Carlos Ganoza on 18 Aug, 2022

Hace ya 3 años que comencé a programar django-paranoid, una librería que permite agregar la funcionalidad de soft-delete a django framework, funcionalidad conocida por todos los que alguna vez hemos usado ruby on rails.

Es decir, esta librería permite a tus proyectos tener la funcionalidad de un “falso borrado”, un borrado que se puede revertir en caso sea necesario.

El año pasado le tomé más importancia al ver que había colegas que lo venían utilizando, y decidí terminar de programar los test y automatizar un par de cosas más en github que me permitan tener el proyecto más ordenado.

Hoy, después de ver un pull request y algunos issues abiertos, recordé que nunca había escrito un post aquí, y como tengo la imperiosa necesidad de que todos sepan que lo hice yo, este es el post, si llegaste hasta aquí, gracias por alimentar mi ego…

¿Cómo lo implementamos en nuestros proyectos?

Instalamos:

1
pip install django-paranoid

Agregamos django-paranoid al proyecto:

1
2
3
4
5
6
7
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
...
'django_paranoid'
...
]

Extendemos ParanoidModel en el modelo a usar:

1
2
3
4
from django_paranoid.models import ParanoidModel

class MyModel(ParanoidModel):
field = models.CharField(max_length=20)

Lo agregamos a django-admin:

1
2
3
4
from django_paranoid.models import ParanoidModel

class MyModel(ParanoidModel):
field = models.CharField(max_length=20)

Borrar un objeto:

se borra cómo normalmente se borra un objeto en django framework.

1
2
m = MyModel.objects.last()
m.delete()

Si queremos recuperar el objeto borrado o hacer consultar sobre este:

1
2
3
4
5
m = MyModel.objects_with_deleted.last()
>>> m
<MyModel: name>
>>> m.deleted_at
datetime.datetime(2019, 8, 10, 6, 16, 44, 633727, tzinfo=<UTC>)

Restaurar objeto borrado:

1
m.restore()

Y si queremos aplicar un hard delete:

1
2
m = MyModel.objects.last()
m.delete(True)

El repositorio del proyecto es el siguiente, por si quieren dejar algún pull request.
https://github.com/drneox/django-paranoid

Espero les sirva!.


Carlos Ganoza

I have more than 6 years of experience in the technology market, I have been involved in different aspects of software development, cybersecurity, and open-source. I ♥ python, the open-source, and I always enjoy learning new skills.