How To add created_at, updated_at, deleted_at, and soft deletion functionality in Django
To add created_at
, updated_at
, deleted_at
, and soft deletion functionality in Django, you can follow these steps:
- Import the necessary modules in your Django models file (
models.py
):
from django.db import models
from django.utils import timezone
- Add the following fields to your model class:
class YourModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
deleted_at = models.DateTimeField(blank=True, null=True)
- The
created_at
field will automatically set the current date and time when a new object is created. - The
updated_at
field will automatically update the date and time whenever the object is saved. - The
deleted_at
field is initially set toNone
, indicating that the object is not deleted. When an object is deleted, you can set this field to the current date and time.
- Create a custom model manager for soft deletions. This manager will handle retrieving only the non-deleted objects:
class YourModelManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(deleted_at__isnull=True)
- Modify your model class to use the custom manager:
class YourModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
deleted_at = models.DateTimeField(blank=True, null=True)
objects = YourModelManager()
all_objects = models.Manager() # Includes all objects (including deleted ones)
-
In the views or wherever you want to retrieve the objects, use
YourModel.objects.all()
to fetch only non-deleted objects. If you want to retrieve all objects (including deleted ones), useYourModel.all_objects.all()
. -
Optionally, you can override the
delete()
method in your model to perform a soft deletion instead of a hard deletion:
class YourModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
deleted_at = models.DateTimeField(blank=True, null=True)
objects = YourModelManager()
all_objects = models.Manager()
def delete(self, using=None, keep_parents=False):
self.deleted_at = timezone.now()
self.save()
- By overriding the
delete()
method, when you callyour_object.delete()
, it will set thedeleted_at
field to the current date and time, effectively soft deleting the object.
With these steps, you should be able to add created_at
, updated_at
, deleted_at
, and soft deletion functionality to your Django models.