#django #django-orm
#django #django-orm
Вопрос:
Я ищу объекты, в которых интервал времени между двумя полями превышает определенное количество дней.
На самом деле у меня есть дата отправки письма и дата получения одобрения. Если утверждение не получено, скажем, через 30 дней, эти объекты должны быть включены в набор запросов.
Я могу сделать что-то вроде приведенного ниже, где дельта является чем-то статическим. Однако мне это не нужно datetime.date.today()
для начала, но нужно сравнить с другим объектом.
delta = datetime.date.today() - datetime.timedelta(30)
return qs.filter(letter_sent__isnull=False)
.filter(approval_from__isnull=True)
.filter(letter_sent__gte=delta)
Любой указатель, как это сделать?
Ответ №1:
Похоже, вы хотите аннотировать F
объект. Что-то вроде этого:
from django.db.models import DurationField, ExpressionWrapper, F
delta = datetime.timedelta(days=30)
expression = F('approval_from') - F('letter_sent')
wrapped_expression = ExpressionWrapper(expression, DurationField())
qs = qs.annotate(delta=wrapped_expression)
qs = qs.filter(delta__gte=delta)
Ответ №2:
Вы также можете сделать это наоборот. Просто держите F(«num_days») вне timedelta, потому что timedelta не знает о F() .
from datetime import timedelta
expression = F('approval_from') - timedelta(days=1) * F("num_days")
wrapped_expression = ExpressionWrapper(expression, DateTimeField())
qs = qs.annotate(letter_sent_annotation=wrapped_expression)
qs = qs.filter(letter_sent__gte=letter_sent_annotation)