Django: Обработка просроченных ключей API без сигналов

Заголовок: Django: Обработка просроченных ключей API без сигналов

Вопрос: Как реализовать в Django логику автоматического удаления просроченных API-ключей из модели OutstandingKey и обновления соответствующей записи BlacklistedKey по истечении срока действия, без использования сигналов?

У меня есть две модели Django: OutstandingKey и BlacklistedKey. Модель OutstandingKey представляет API-ключи, сгенерированные пользователями, включая поле даты истечения срока действия. Модель BlacklistedKey хранит ключи API из черного списка, ссылаясь на OutstandingKey через отношение "один к одному".

Я хочу создать систему, в которой просроченные API-ключи автоматически удаляются из модели OutstandingKey и добавляются в модель BlacklistedKey, когда истекает срок их действия. Однако я предпочитаю не использовать сигналы для этой реализации из-за этого Django Anti-Pattern.

Может ли кто-нибудь предоставить чертеж или пример того, как достичь этой логики в Django?

Ниже представлены мои модели

from django.db import models
from django.conf import settings
from django.utils import timezone

class OutstandingKey(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        default=None,
        verbose_name="User",
    )
    name = models.CharField(max_length=1000, default="", blank=True, null=True)
    api_key = models.CharField(
        max_length=1000,
        unique=True,
        verbose_name="API Key",
        default="",
        blank=True,
        null=True,
        editable=False,
    )
    expiry_date = models.DateTimeField(
        default=None, verbose_name="Expiry Date", blank=True, null=True
    )
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Outstanding Tokens"
        verbose_name = "Outstanding API Key"
        ordering = ["-timestamp"]


class BlacklistedKey(models.Model):
    key = models.OneToOneField(
        OutstandingKey, on_delete=models.CASCADE, primary_key=True
    )
    key_value = models.CharField(
        max_length=1000,
        unique=True,
        verbose_name="API Key",
        default="",
        blank=True,
        null=True,
    )
    blacklisted_at = models.DateTimeField(
        auto_now_add=True, verbose_name="Blacklisted At"
    )

    class Meta:
        verbose_name_plural = "Blacklisted Tokens"
        verbose_name = "Blacklisted Key"

    def __str__(self):
        return self.key.name
Вернуться на верх