from django.db import models from django.utils import timezone class BaseModel(models.Model): class Meta: abstract = True class DeactivatedQueryset(models.Manager): def get_queryset(self): queryset = super().get_queryset() return queryset.filter(deactivated_at__isnull=True) def allow_delete(self): super().delete() def delete(self): count = self.count() self.filter(deactivated_at__isnull=True).update( deactivated_at=timezone.now() ) return (count, None) class DeactivatedMixin(models.Model): deactivated_at = models.DateTimeField(null=True, blank=True, default=None) objects = DeactivatedQueryset() class Meta: abstract = True def allow_delete(self, using=None, keep_parents=False): super().delete(using=using, keep_parents=keep_parents) def delete(self, using=None, keep_parents=False): if not self.deactivated_at: self.deactivated_at = timezone.now() self.save()