Django Soft Delete
raw JSON → 1.0.23 verified Mon Apr 27 auth: no python
Soft delete models, managers, and queryset for Django. Enables soft deletion by setting a boolean flag instead of actually removing rows. Current version 1.0.23, requires Python >=3.6. Release cadence: low activity, maintained.
pip install django-soft-delete Common errors
error ImportError: cannot import name 'SoftDeleteModel' from 'soft_delete' ↓
cause Incorrect package name in import (underscore vs hyphen).
fix
Use 'from softdelete.models import SoftDeleteModel' (no underscore after 'soft').
error AttributeError: 'SoftDeleteModel' object has no attribute 'restore' ↓
cause Model not inheriting from SoftDeleteModel correctly or using old version.
fix
Ensure model inherits from SoftDeleteModel and is using django-soft-delete >=1.0.0.
Warnings
gotcha SoftDeleteModel does NOT automatically filter out soft-deleted objects in related queries. You must explicitly use .all_objects or override default manager. ↓
fix Use MyModel.all_objects.filter(...) to include soft-deleted items.
gotcha The default manager returns all objects including soft-deleted ones by default. This is opposite to many other soft-delete libraries. ↓
fix Override manager if needed or always call .objects.filter(is_deleted=False).
deprecated SoftDeleteQuerySet is deprecated; use SoftDeleteManager's queryset instead. ↓
fix Move queryset methods to manager.
Imports
- SoftDeleteModel wrong
from soft_delete.models import SoftDeleteModelcorrectfrom softdelete.models import SoftDeleteModel - SoftDeleteManager
from softdelete.models import SoftDeleteManager
Quickstart
from softdelete.models import SoftDeleteModel
class MyModel(SoftDeleteModel):
name = models.CharField(max_length=100)
# Delete softly
obj = MyModel.objects.create(name='test')
obj.delete() # sets is_deleted = True
# Hard delete
obj.hard_delete()
# Restore
obj.restore()