Soft delete models, managers, queryset for Django
Project description
Django Soft Delete
This is a set of small classes to make soft deletion of objects.
Use the abstract model SoftDeleteModel
for adding two new fields:
is_deleted
- is a boolean field, shows weather of a deletion state of objectdeleted_at
- is a DateTimeField, serves a timestamp of deletion.
Also, you can use SoftDeleteManager
and DeletedManager
object managers for getting
alive and deleted objects accordingly.
By default, the SoftDeleteModel
has objects
attribute as SoftDeleteManager
and
deleted_objects
attribute as DeletedManager
.
How to use
pip install django-soft-delete
Add the SoftDeleteModel
as a parent for your model:
# For regular model
from django.db import models
from django_softdelete.models import SoftDeleteModel
class Article(SoftDeleteModel):
title = models.CharField(max_length=100)
# Following fields will be added automatically
# is_deleted
# deleted_at
# Following managers will be added automatically
# objects = SoftDeleteManager()
# deleted_objects = DeletedManager()
# global_objects = GlobalManager()
# For inherited model
from django_softdelete.models import SoftDeleteModel
class Post(SoftDeleteModel, SomeParentModelClass):
title = models.CharField(max_length=100)
Make and apply the migrations:
./manage.py makemigrations
./manage.py migrate
Relations
You can also use soft deletion for models that are related to others. This library does not interfere with standard Django functionality. This means that you can also use cascading delete, but remember that soft delete only works with the SoftDeleteModel
classes. If you delete an instance of the parent model and use cascading delete, then the instances of the child model will be hard-deleted. To prevent hard deletion in this case, you should use SoftDeleteModel
for child models in the same way as for parent model.
Quick example
a1 = Article.objects.create(title='django')
a2 = Article.objects.create(title='python')
a3 = Article.objects.create(title='django_softdelete')
Article.objects.count() # 3
a1.delete() # soft deletion of object
Article.objects.count() # 2
deleted_a1 = Article.deleted_objects.first() # <Article: 'django'>
deleted_a1.restore() # restores deleted object
Article.objects.count() # 3
Article.deleted_objects.count() # 0
a1.hard_delete() # deletes the object at all.
Batch deletion
Article.objects.filter(some_value=True).delete() # soft delete for all filtered objects
Article.deleted_objects.filter(some_value=True).restore() # restore for all filtered objects
Custom manager
If you need a soft delete functionality for model with your own object manager,
you want to extend it with the SoftDeleteManager
.
from django_softdelete.models import SoftDeleteManager
class YourOwnManager(SoftDeleteManager):
pass
The same class exists for the deleted_objects
manager too -- DeletedManager
.
Custom QuerySet
If you need to use soft delete functionality for your custom QuerySet
, use the
SoftDeleteQuerySet
as a parent class or extending existing one.
from django_softdelete.models import SoftDeleteQuerySet
class YourOwnQuerySet(SoftDeleteQuerySet):
pass
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
Hashes for django-soft-delete-1.0.13.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 443c00a54c06d236ff8806c3260243d775cc536581d7377c2785080b1041ce1d |
|
MD5 | 06450a7e4c739719f04eca58137e82d9 |
|
BLAKE2b-256 | 070a97c65a429cc07a1a9a5459b7e53b96c1f47b41985ff6475b905511acea9e |
Hashes for django_soft_delete-1.0.13-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7cb4524231763a70ad79cfccd49d001b7e5fa666ec897cc044d897dd73e0146e |
|
MD5 | ec7c9221979cd1f2ab7e07e105eb86a8 |
|
BLAKE2b-256 | 18ce1eb92f8bba5be9953532f10a53e9dc223c63b08d5cf4549562ae1644f287 |