Django orm filter datetime by integer of days
 У меня есть модель с именем AccessDuration с двумя важными полями duration (int) и lab_start_date (datetime). На основе обоих полей я хочу проверить, истекло ли время доступа или еще нет. Это делается с помощью функций модели.
class AccessDuration(models.Model):
    ....
    duration = models.PositiveIntegerField(default=30, help_text=_('In days'))
    lab_start_date = models.DateTimeField(verbose_name=('Start Date'), null=True)
    @property
    def expiration_date(self) -> Union[timezone.datetime, None]:
        if self.lab_start_date:
            return self.lab_start_date + timezone.timedelta(days=self.duration)
        return None
    @property
    def is_expired(self) -> bool:
        """ to check whether duration already expired or yet """
        if self.expiration_date:
            return timezone.now() > self.expiration_date
        return False
Но мне нужно, чтобы этот фильтр можно было использовать на моей странице администратора django. Я пробовал с этим, но, кажется, все еще не работает:
from django.db import models
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from .models import AccessDuration
class AccessListFilter(admin.SimpleListFilter):
    title = _('Is Expired')
    parameter_name = 'is_expired'
    def lookups(self, request, model_admin):
        return [
            ('true', _('True')),
            ('false', _('False'))
        ]
    def queryset(self, request, queryset):
        value = self.value()
        expiration_date = models.ExpressionWrapper(
            models.F('lab_start_date') + (timezone.timedelta(days=1) * models.F('duration')),
            output_field=models.DateTimeField()
        )
        if value == 'true':
            return queryset.annotate(expiration_date=expiration_date)\
                           .filter(expiration_date__lt=timezone.now())
        elif value == 'false':
            return queryset.annotate(expiration_date=expiration_date)\
                           .filter(expiration_date__gte=timezone.now())
        return queryset
class AccessAdmin(admin.ModelAdmin):
    list_filter = (AccessListFilter, 'lab_start_date')
admin.site.register(AccessDuration, AccessAdmin)
Ошибка, которую я обнаружил;
Вы должны использовать другое имя, которое expiration_date для аннотации. Например:
from django.db.models.functions import Now
if value == 'true':
    return queryset.annotate(
        _expiration_date=expiration_date
    ).filter(_expiration_date__lt=Now())
elif value == 'false':
    return queryset.annotate(
        _expiration_date=expiration_date
    ).filter(_expiration_date__gte=Now())
                    