{"id":21162,"library":"django-soft-delete","title":"Django Soft Delete","description":"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.","status":"active","version":"1.0.23","language":"python","source_language":"en","source_url":"https://github.com/san4ezy/django_softdelete","tags":["django","soft-delete","orm"],"install":[{"cmd":"pip install django-soft-delete","lang":"bash","label":"Install from PyPI"}],"dependencies":[{"reason":"Core dependency","package":"django","optional":false}],"imports":[{"note":"Package uses underscore in module name but hyphen in PyPI slug","wrong":"from soft_delete.models import SoftDeleteModel","symbol":"SoftDeleteModel","correct":"from softdelete.models import SoftDeleteModel"},{"note":"","wrong":"","symbol":"SoftDeleteManager","correct":"from softdelete.models import SoftDeleteManager"}],"quickstart":{"code":"from softdelete.models import SoftDeleteModel\n\nclass MyModel(SoftDeleteModel):\n    name = models.CharField(max_length=100)\n\n# Delete softly\nobj = MyModel.objects.create(name='test')\nobj.delete()  # sets is_deleted = True\n\n# Hard delete\nobj.hard_delete()\n\n# Restore\nobj.restore()","lang":"python","description":"Basic usage: inherit SoftDeleteModel, then use delete/restore/hard_delete."},"warnings":[{"fix":"Use MyModel.all_objects.filter(...) to include soft-deleted items.","message":"SoftDeleteModel does NOT automatically filter out soft-deleted objects in related queries. You must explicitly use .all_objects or override default manager.","severity":"gotcha","affected_versions":"all"},{"fix":"Override manager if needed or always call .objects.filter(is_deleted=False).","message":"The default manager returns all objects including soft-deleted ones by default. This is opposite to many other soft-delete libraries.","severity":"gotcha","affected_versions":"all"},{"fix":"Move queryset methods to manager.","message":"SoftDeleteQuerySet is deprecated; use SoftDeleteManager's queryset instead.","severity":"deprecated","affected_versions":">=1.0.0"}],"env_vars":null,"last_verified":"2026-04-27T00:00:00.000Z","next_check":"2026-07-26T00:00:00.000Z","problems":[{"fix":"Use 'from softdelete.models import SoftDeleteModel' (no underscore after 'soft').","cause":"Incorrect package name in import (underscore vs hyphen).","error":"ImportError: cannot import name 'SoftDeleteModel' from 'soft_delete'"},{"fix":"Ensure model inherits from SoftDeleteModel and is using django-soft-delete >=1.0.0.","cause":"Model not inheriting from SoftDeleteModel correctly or using old version.","error":"AttributeError: 'SoftDeleteModel' object has no attribute 'restore'"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}