Django: Использование F-выражения IntegerField для аннотирования поля DateField
У меня есть такая модель:
class RentDue(models.Model):
balance = DecimalField()
day_due = IntegerField() # e.g. 1-5, representing the 1st through 5th of the month
Я хочу иметь возможность аннотировать набор запросов, используя целое число из day_due
для создания нового атрибута rent_due_date
, чтобы я мог фильтровать по дате наступления следующего месяца следующим образом:
from datetime import date, timedelta
# create RentDue instances -- one due on the 1st another on the 3rd
rent_due_first = RentDue.objects.create(day_due=1)
rent_due_third = RentDue.objects.create(day_due=3)
# query for all RentDue on the 1st or earlier
RentDue.objects.annotate(
rent_due_date=date(2022, 12, F('day_due'))
).filter(
rent_due_date__lte=date(2022, 12, 1)
)
# -> returns [rent_due_first]
# query for all RentDue on the 3rd or earlier
RentDue.objects.annotate(
rent_due_date=date(2022, 12, F('day_due'))
).filter(
rent_due_date__lte=date(2022, 12, 3)
)
# -> returns [rent_due_first, rent_due_third]
Однако, передача выражения F
в date
приводит к TypeError: an integer is required (got type F)
Я пробовал использовать ExpressionWrapper
как описано в этом ответе , а также TruncDate
, но получаю какие-то странные ошибки, которые не совсем понимаю.
Возможным решением было бы аннотировать весь набор запросов с DateField из next_month
(жестко закодированным в date(2022, 12, 1)
и затем иметь возможность использовать это в F
выражении/ExpressionWrapper
, но это кажется большой работой.
Просто нужны идеи, чтобы заставить мой разум работать. Заранее спасибо!