django-resurrected provides soft-delete functionality for Django projects.
Instead of permanently removing objects, it marks them as “removed,” making them easy to restore later.
The package supports relation-aware deletion and restoration, along with configurable retention.
Table of Contents
Quick Start
1. Install
pip install django-resurrected
2. Update Your Models
Inherit from SoftDeleteModel to enable soft-deletion and restoration:
from django.db import models
from django_resurrected.models import SoftDeleteModel
class Author(SoftDeleteModel):
name = models.CharField(max_length=100)
class Book(SoftDeleteModel):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
class BookMeta(SoftDeleteModel):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
format = models.CharField(max_length=20)
3. Use the Enhanced Managers
Each manager now has:
.objects— only active (not removed).removed_objects— only soft-deleted.all_objects— all records (active + removed)
4. Remove (Soft-Delete) with Cascading
Removing a parent will also remove its related children:
>>> author = Author.objects.create(name="Frank")
>>> book = Book.objects.create(author=author, title="Dune")
>>> meta = BookMeta.objects.create(book=book, format="ebook")
>>> Author.objects.count()
1
>>> Book.objects.count()
1
>>> BookMeta.objects.count()
1
>>> author.remove()
(3, {'test_app.Author': 1, 'test_app.Book': 1, 'test_app.BookMeta': 1})
>>> Author.objects.count()
0
>>> Book.objects.count()
0
>>> BookMeta.objects.count()
0
5. Restore: Selective or Cascading
Restore only the top-level object
>>> author.restore()
(1, {'test_app.Author': 1})
>>> Author.objects.count()
1
>>> Book.objects.count()
0
>>> BookMeta.objects.count()
0
Restore with all related objects
>>> author.restore(with_related=True)
(3, {'test_app.Author': 1, 'test_app.Book': 1, 'test_app.BookMeta': 1})
>>> Author.objects.count()
1
>>> Book.objects.count()
1
>>> BookMeta.objects.count()
1
Restore from a mid-level object
>>> author.remove()
(3, {'test_app.Author': 1, 'test_app.Book': 1, 'test_app.BookMeta': 1})
>>> book.restore()
(2, {'test_app.Book': 1, 'test_app.Author': 1})
>>> Author.objects.count()
1
>>> Book.objects.count()
1
>>> BookMeta.objects.count()
0
Configuration
You can customize the retention period by setting the retention_days attribute on your model. Set it to None to keep objects indefinitely.
# your_app/models.py
from django_resurrected.models import SoftDeleteModel
class ImportantDocument(SoftDeleteModel):
# Keep forever
retention_days = None
content = models.TextField()
class TemporaryFile(SoftDeleteModel):
# Keep for one week
retention_days = 7
data = models.BinaryField()
To permanently remove objects that have exceeded their retention limit, call purge():
>>> TemporaryFile.removed_objects.all().purge()
License
This project is licensed under the MIT License.
Release files for django-resurrected 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_resurrected-0.4.0.tar.gz | 94.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_resurrected-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 100.1 kB
Release files / django_resurrected-0.4.0.tar.gz
| Download URL | django_resurrected-0.4.0.tar.gz |
|---|---|
| Size | 94.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c745ea04a72f345f254072eb0c7774ea49f5e544fd2ec590999a31639b6b00d1
|
|
BLAKE2b-256 checksum How to use checksums |
7ecbe45f620e6caf5571cd09b673fdacaf85fc6063db27ca9de5f162869a8ad4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2025.
Transparency logRelease files / django_resurrected-0.4.0-py3-none-any.whl
| Download URL | django_resurrected-0.4.0-py3-none-any.whl |
|---|---|
| Size | 5.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9cc572d9925c5959e9355acf124b456a5252d7626e5dd0d20c1f19e34d24debf
|
|
BLAKE2b-256 checksum How to use checksums |
b9769dacc0ed8abc8198593668b1c310021ed935211b7e26fd426d1aef32c2aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2025.
Transparency log