Created
October 7, 2022 22:06
-
-
Save diek/8cebd3222313dc08a722b633d63bb6ee to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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