• Home
  • Django
  • customize queryset and queryset methods

customize queryset and queryset methods

linkaiyi
Follow

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()
Object has 0 attachments

Was this article helpful?

This article is viewed 16 times!

Recent Viewed Articles

0 Comments

Leave a Comment

Support