Django safedelete

What is it ?

For various reasons, you may want to avoid deleting objects from your database.

This Django application provides a model mixin, that allows you to transparently retrieve or delete your objects, without having them deleted from your database.

You can choose what happens when you delete an object :
  • it can be masked from your database (soft delete)
  • it can be normally deleted (hard delete)
  • it can be hard-deleted, but if its deletion would delete other objects, it will only be masked
  • it can be never deleted or masked from your database (no delete, use with caution)


# Models

# We create a new model, with the given policy : Objects will be hard-deleted, or soft deleted if other objects would have been deleted too.
class Article(SafeDeleteMixin):
    _safedelete_policy = HARD_DELETE_NOCASCADE

    name = models.CharField(max_length=100)

class Order(SafeDeleteMixin):
    _safedelete_policy = HARD_DELETE_NOCASCADE

    name = models.CharField(max_length=100)
    articles = models.ManyToManyField(Article)

# Example of use

>>> article1 = Article(name='article1')

>>> article2 = Article(name='article2')

>>> order = Order(name='order')
>>> order.articles.add(article1)

# This article will be masked, but not deleted from the database as it is still referenced in an order.
>>> article1.delete()

# This article will be deleted from the database.
>>> article2.delete()


  • Branch 0.2.x is compatible with django >= 1.2
  • Branch 0.3.x is compatible with django >= 1.4
  • Branch 0.4.x is compatible with django >= 1.8

Current branch (0.4.x) has been tested with :

  • Django 1.8 using python 2.7 and python 3.3 to 3.4.
  • Django 1.9 using python 2.7 and python 3.4 to 3.5.
  • Django 1.10 using python 2.7 and python 3.4 to 3.5.


Installing from pypi (using pip).

pip install django-safedelete

Installing from github.

pip install -e git://

The application doesn’t have any special requirement.