Нужен способ узнать, когда запрашиваются мои экземпляры Django Model - PullRequest
1 голос
/ 04 апреля 2020

Я пытаюсь добавить Framework к моим Django моделям, которые позволят экземплярам моей модели истечь. У меня будет временное задание, которое будет проходить через истекающие модели и удалять экземпляры с истекшим сроком действия.

У меня есть разные типы истечений, которые я хочу выполнить. Первым из них является базовый c TimeDeltaExpiry, который истекает экземпляры после timedelta с момента последнего сохранения экземпляра. Истечение срока действия обновляется при сохранении экземпляра.

    def save(self, *args, **kwargs):
        self.expiry = self.expiry.datetime + timedelta(minutes=2)
        super(TimeDeltaExpiry, self).save()

Вторым является RefreshableTimeDeltaExpiry, который должен обновляться при каждом запросе экземпляра. Не уверен, что это вообще возможно, но я искал метод или функцию, которая позволила бы мне захватывать при обращении к экземпляру. Также существует опасение, что при выполнении моей задачи очистки она также будет ссылаться на экземпляр и обновит срок действия, что я, конечно, не хотел бы, чтобы это произошло.

Есть ли метод, который мог бы позволить мне делать то, что я хочу?

Вот мой пока непроверенный код

class ExpiryManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().annotate(
            expired=ExpressionWrapper(Q(expiry__lt=Now()), output_field=BooleanField())
        )


class ExpiryBase(models.Model):
    expiry = models.DateTimeField()

    objects = ExpiryManager()

    class Meta:
        abstract = True


class TimeDeltaExpiry(ExpiryBase):
    def save(self, *args, **kwargs):
        self.expiry = self.expiry.datetime + timedelta(minutes=2)
        super(TimeDeltaExpiry, self).save()

    class Meta:
        abstract = True


class RefreshableTimeDeltaExpiry(TimeDeltaExpiry):
    class Meta:
        abstract = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...