A simple Django app to add soft-delete functionality to desired models
Project description
Add soft-delete functionality to desired models.
Quick start
Follow steps mentioned below to add soft-delete feature in any model of your django app.
pip install django-softdelete-it
Add soft_delete_it to your INSTALLED_APPS setting like this:
INSTALLED_APPS = [ ... 'soft_delete_it', ]
Import SoftDeleteModel from soft_delete_it app to your model file like this:
from soft_delete_it import SoftDeleteModel
- Inherit SoftDeleteModel class to your model class. It will add following features:
- objects manager’s behavior will change such that:
delete() method which will soft delete instances
will always return return only ‘non soft deleted’ objects
hard_delete()` method to hard delete the objects
- all_objects manager:
will always return both soft deleted and non soft deleted objects
hard_delete() method to hard delete the objects
only_deleted() method to return only soft deleted objects
undelete() method to un-delete soft-deleted objects
Example
from django.db import models from soft_delete_it.models import SoftDeleteModel class Author(SoftDeleteModel): name = models.CharField(max_length=50) dob = models.DateField() class Article(SoftDeleteModel): title = models.CharField(max_length=50) body = models.TextField(null=True) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='articles') Bob = Author.objects.create(name='bob', dob='2000-12-12') John = Author.objects.create(name='john', dob='1990-10-12') Author.objects.all() # return QuerySet with 2 objects Bob.delete() # Bob is soft-deleted Author.objects.all() # return QuerySet with 1 object, John Author.all_objects.all() # return QuerySet with 2 object, Bob and John Bob.undelete() # un-deletes Bob object Author.objects.all() # return QuerySet with 2 objects article1 = Article(title='Bob The Builder', body='') article1.author = Bob article1.save() Article.objects.all() # return QuerySet with 1 object, article1 Bob.delete() # soft-deletes both Bob and article1 as Article's author field is on_delete_cascade and it Inherits SoftDeleteModel
If you are implementing a new Manager for a model, simply inherit SoftDeleteManager as well along with other Managers.
- If you are implementing a new QuerySet for a model, you will need to do following:
Inherit SoftDeleteQuerySet
Write Manager inheriting SoftDeleteManager which defines soft-delete functionality in it’s __init__() method(as in the example) and override get_queryset() method(as in the example)
Write model class inheriting SoftDeleteModel and uses above new defined Manager method(as in the example)
Example with QuerySet
Lets create a QuerySet for Article such that if no author is provided while creating a new article, one default author will be added in object.
#Creating a default author object first default_author = Author.objects.create(name='default') #Implementing QuerySet from soft_delete_it.models import SoftDeleteModel, SoftDeleteQuerySet, SoftDeleteManager class ArticleQuerySet(SoftDeleteQuerySet): def create(self, **kwargs): try: author = kwargs['author'] except KeyError: kwargs['author'] = Author.objects.get(name='default') article = super(ArticleQuerySet, self).create(**kwargs) return article class ArticleManager(SoftDeleteManager): def __init__(self, *args, **kwargs): self.deleted_also = kwargs.get('deleted_also', False) super(ArticleManager, self).__init__(*args, **kwargs) def get_queryset(self): '''return all unsoft-deleted objects''' if self.deleted_also: return ArticleQuerySet(self.model) return ArticleQuerySet(self.model).filter(deleted=None) class Article(SoftDeleteModel): title = models.CharField(max_length=50) body = models.TextField(null=True) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='articles') objects = ArticleManager.from_queryset(ArticleQuerySet)() all_objects = ArticleManager.from_queryset(ArticleQuerySet)(deleted_also=True)
How soft-deletion functionality is implemented:
Create a new soft_delete app, whole code for soft-deletion functionality is implemented in its models.py file.
An abstract SoftDeleteModel added which contains a deleted attribute which is a UUIDField. It will hold None for undeleted object and a new uuid4 for deleted objects.
SoftDeleteQuerySet implemented to override default django’s delete method to soft-delete objects instead of hard deleting them.
undelete(), hard_delete(), only_deleted() methods are implemented in same QuerySet class to provide extra features.
SoftDeleteManger implemented to use above QuerySet by overriding get_queryset() method.
QuerySet’s delete method is necessary to override to support bulk_delete feature.
Call pre_delete and post_delete signals before and after the definition of above delete method.
Use NestedObjects from django admin utils to soft-delete all related objects.
Two managers, objects and all_objects to return undeleted, all objects are implemented.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django-softdelete-it-0.1.tar.gz
.
File metadata
- Download URL: django-softdelete-it-0.1.tar.gz
- Upload date:
- Size: 6.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ea4f39205a6f8c0dd8fc0686c1f937674ae4b8fed23e861cc7c193f66d533016 |
|
MD5 | 97f6c557377e7840d2bd25ea65a03f47 |
|
BLAKE2b-256 | 5423db52ab9a513036d542d70bc9d68f453c3edd06377c1790551998798fc488 |
File details
Details for the file django_softdelete_it-0.1-py3-none-any.whl
.
File metadata
- Download URL: django_softdelete_it-0.1-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d311b75435e87b742fd5210979f5b57973343c1fea4125d0d9728e9819dc5438 |
|
MD5 | 4a250ab4d59fbcdc17596d14f62ee64b |
|
BLAKE2b-256 | 2de492d806df8aa68a4181d8f88613ae17a02710a043a1d2a6f9b844920a9248 |