33
loading...
This website collects cookies to deliver better user experience
ParanoiaModel
, which will serve as the base model.class ParanoidModel(models.Model):
class Meta:
abstract = True
deleted_on = models.DateTimeField(null=True, blank=True)
def delete(self):
self.deleted_on=timezone.now()
self.save()
ParanoidQuerySet
.class ParanoidQuerySet(QuerySet):
"""
Prevents objects from being hard-deleted. Instead, sets the
``date_deleted``, effectively soft-deleting the object.
"""
def delete(self):
for obj in self:
obj.deleted_on=timezone.now()
obj.save()
class ParanoidManager(models.Manager):
"""
Only exposes objects that have NOT been soft-deleted.
"""
def get_queryset(self):
return ParanoidQuerySet(self.model, using=self._db).filter(
deleted_on__isnull=True)
class ParanoidModel(models.Model):
class Meta:
abstract = True
deleted_on = models.DateTimeField(null=True, blank=True)
objects = ParanoidManager()
original_objects = models.Manager()
def delete(self):
self.deleted_on=timezone.now()
self.save()
class Post(ParanoidModel):
title = models.CharField(max_length=100)
content = models.TextField()
post = Post(title="soft delete strategies", content="Trying out various soft delete strategies")
post.delete()
# Will soft delete the post
Post.objects.all().delete()
# Will also soft delete all the posts.
Post.objects.get()
# Will not return any post and will raise an exception.
Post.original_objects.get()
# Will return the soft deleted post.
Post.original_objects.all()
# Returns soft deleted objects as well, along with the undeleted ones.
post = Post(title="soft delete strategies", content="Trying out various soft delete strategies")
class Comment(ParanoidModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
message = models.TextField()
comment = Comment(post, message="Well written blog post")
# post is the object we created earlier.
post.delete()
# Soft delete the post.
print(Comment.objects.count())
# The comment of the post still exists.
post
.undelete
method to the base model ParanoiaModel
.class ParanoidModel(models.Model):
class Meta:
abstract = True
deleted_on = models.DateTimeField(null=True, blank=True)
objects = ParanoidManager()
original_objects = models.Manager()
def delete(self):
self.deleted_on=timezone.now()
self.save()
def undelete(self):
self.deleted_on=None
self.save()
class ParanoidQuerySet(QuerySet):
"""
Prevents objects from being hard-deleted. Instead, sets the
``date_deleted``, effectively soft-deleting the object.
"""
def delete(self):
for obj in self:
obj.deleted_on=timezone.now()
obj.save()
def undelete(self):
for obj in self:
obj.deleted_on=None
obj.save()
deleted_on
from django.db import models
from safedelete.models import SafeDeleteModel
from safedelete.models import SOFT_DELETE
class Article(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Comment(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='article_comments')
text = models.TextField()
# First we create an article
article = Article.objects.create(
title="article 1 title",
content="article 1 content"
)
article.delete()
# Will soft delete the article.
Article.objects.all().delete()
# Will soft delete all the articles.
Article.objects.all()
# Will return objects which are not deleted (Either soft/hard)
Article.objects.all_with_deleted()
# Will fetch all the objects including the deleted one's
Article.original_objects.all()
# Will fetch all the objects including the deleted one's using our custom manager.
article.undelete()
from django.db import models
from safedelete.models import SafeDeleteModel
from safedelete.models import SOFT_DELETE_CASCADE
class User(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
full_name = models.CharField(max_length=100)
email = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class UserLogin(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_logins")
login_time = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
user = User.objects.create(
full_name="sam kin",
email="[email protected]"
)
UserLogin.objects.create(
user=user
)
UserLogin.objects.create(
user=user
)
user.delete()
User.objects.count()
# User count will be 0
UserLogin.objects.count()
# UserLogin count will also be 0. (Since this is cascade soft delete)
# Both user and user login are soft deleted.
user.undelete()