Replacing delete, with hidden

Posted by Matt on Aug. 19, 2009 at 09:55

One fairly common thing on a completed application is the request to hide rows from the database, rather than delete.

Just today I had this problem, and this was solved in just a couple of lines.

These are standard Django functions, nothing custom.

My current model (for example only)

    class Category(models.Model):
        title = models.CharField(max_length=100, unique=True)

My new model

    class Category(models.Model):
        title = models.CharField(max_length=100, unique=True)
        deleted = models.BooleanField(db_index=True)
        objects = NotDeleted() 
        show_all = models.Manager()

What is this NotDeleted?, this is where the magic happens.

    class NotDeleted(models.Manager):
        def get_query_set(self):
            return super(NotDeleted, self).get_query_set().filter(deleted=False)

This will automatically append deleted=False to your database query.

If for some reason you need to get deleted items again,

    categories = Category.show_all.all()

You could create a separate manager, just to show deleted items as well.

For more information on Django database managers, http://docs.djangoproject.com/en/1.0/topics/db/managers/#modifying-initial-manager-querysets

Comments