Plain is headed towards 1.0! Subscribe for development updates →

 1from plain import models
 2from plain.utils import timezone
 3
 4
 5class CachedItemQuerySet(models.QuerySet):
 6    def expired(self):
 7        return self.filter(expires_at__lt=timezone.now())
 8
 9    def unexpired(self):
10        return self.filter(expires_at__gte=timezone.now())
11
12    def forever(self):
13        return self.filter(expires_at=None)
14
15
16@models.register_model
17class CachedItem(models.Model):
18    key = models.CharField(max_length=255)
19    value = models.JSONField(required=False, allow_null=True)
20    expires_at = models.DateTimeField(required=False, allow_null=True)
21    created_at = models.DateTimeField(auto_now_add=True)
22    updated_at = models.DateTimeField(auto_now=True)
23
24    class Meta:
25        queryset_class = CachedItemQuerySet
26        indexes = [
27            models.Index(fields=["expires_at"]),
28        ]
29        constraints = [
30            models.UniqueConstraint(
31                fields=["key"], name="plaincache_cacheditem_unique_key"
32            ),
33        ]
34
35    def __str__(self) -> str:
36        return self.key