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, но это кажется большой работой.

Просто нужны идеи, чтобы заставить мой разум работать. Заранее спасибо!

Вернуться на верх