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
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.
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.

Basic usage: inherit SoftDeleteModel, then use delete/restore/hard_delete.

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()