Skip to content

Instantly share code, notes, and snippets.

@diek
Created October 7, 2022 22:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save diek/8cebd3222313dc08a722b633d63bb6ee to your computer and use it in GitHub Desktop.
Save diek/8cebd3222313dc08a722b633d63bb6ee to your computer and use it in GitHub Desktop.
from django.db import models
from django.utils import timezone
""" Source: https://twitter.com/JackDLinke/status/1578435998492475392/photo/1"""
class ItemQuerySet(self):
"""Used to return a QuerySet that has been filtered"""
def expired_items(self):
return self.filter(expired_isnull=True)
class ItemManager(models.Manager):
"""Used for table-level methods that do NOT return a QuerySet"""
def delete_expired_items(self):
self.expired_items().delete()
def get_queryset(self):
"""Limit every query used with this Queryset / Manager to critical Items"""
return super().get_queryset().filter(critical=True)
class Item(models.Model):
critical = models.BooleanField(default=True)
expired = models.DateTimeField(blank=True, null=True)
# Uses the `from_queryset` method to combine Manager and QuerySet
# https://docs.djangoproject.com/en/4.1/topics/db/managers/#from-queryset
CombinedItemManager = ItemManager.from_queryset(ItemQuerySet)
objects = CombinedItemManager()
# Optional additional manager with no query filter limitations
unscoped = models.Manager()
def expire_item(self):
self.expired = timezone.now()
self.save()
# Returns all critical items
Item.objects.all()
# Returns all critical items that are expired
Item.objects.expired_items()
# Expire a single item
item = Item.objects.first()
item.expire_item()
# Deletes any critical Items that are expired
Item.objects.delete_expired_items()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment