Менеджер Django с объектом datetime.timedelta внутри F-запроса в сочетании с аннотацией и фильтром - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь создать метод менеджера внутри моего приложения, чтобы отфильтровать объект электронной почты, который был создан 5/10/15 минут или что-то еще, считая точно с этого момента.

Хотя я собираюсь использовать аннотацию для создания нового параметра, который будет bool, и его состояние зависит от простого вычитания с делением и проверки, если результат больше 0.

from django.db.models import F
from django.utils import timezone


delta = 60 * 1 * 5
current_date = timezone.now()
qs = self.annotate(passed=((current_date - F('created_at')).seconds // delta > 0)).filter(passed=True)

Atm моя ошибка говорит:
AttributeError: 'CombinedExpression' object has no attribute 'seconds'

Это явно происходит из-за того факта, что ((current_date - F('created_at')) оценивает не объект datetime.timedelta, а объект CombinedExpression.

Я вижу больше проблем, например, как сравнить выражение с 0?

В любом случае, буду признателен за любые советы, если я приблизился к достижению своей цели или вся логика этого запроса неверна

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Почему бы не что-то вроде этого:

time_cut_off = timezone.now() - timezone.timedelta(minutes=delta)
qs = self.filter(created_at__gte=time_cut_off)

Это даст вам сообщения, созданные за последние дельта минут. Или где вы ищете сообщения, созданные ровно 5 минут назад (как вы определяете это, если это вопрос).

0 голосов
/ 25 мая 2019

Ну, мне удалось найти решение, даже если оно не изящное, оно работает

qs = self.annotate(foo=Sum(current_date - F('created_at'))).filter(foo__gt=Sum(timezone.timedelta(seconds=delta)))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...