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    objects = CachedItemQuerySet.as_manager()
25
26    class Meta:
27        indexes = [
28            models.Index(fields=["expires_at"]),
29        ]
30        constraints = [
31            models.UniqueConstraint(
32                fields=["key"], name="plaincache_cacheditem_unique_key"
33            ),
34        ]
35
36    def __str__(self) -> str:
37        return self.key