Customize queryset and queryset methods
override objects with customized model manager
# override the delete method of the queryset
from cacheops import invalidate_model
class ValidSalesQuerySet(models.query.QuerySet):
def delete(self):
result = self.update(is_deleted=True)
invalidate_model(self.model) # by using cacheops, queryset.update() will not trigger invalidation method
return result
# customize the model manager
class ValidSales(models.Manager):
def get_queryset(self):
return ValidSalesQuerySet(self.model, using=self._db).filter(is_deleted=False)
class Sales(TimeStampedModel):
...
is_deleted = models.BooleanField(verbose_name=_('Deleted'), default=False, db_index=True)
created_by = models.ForeignKey(User, verbose_name=_('Created by'), on_delete=models.SET_NULL, null=True,
related_name='%(class)s_created_by')
modified_by = models.ForeignKey(User, verbose_name=_('Modified by'), on_delete=models.SET_NULL, null=True,
related_name='%(class)s_modified_by')
objects = ValidSales() # normal objects.all() only include not data which are not marked delete flag
whole_objects = models.Manager() # whole_objects.all() return all data
def save(self, *args, **kwargs):
if not self.pk:
self.created_by = self.modified_by
if not self.sales_calculate_date:
self.sales_calculate_date = self.sales_date
super(Sales, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
self.is_deleted = True
self.save()