Django - Вычисление возраста до даты в БД
Я новичок в Django. Пожалуйста, помогите мне с этой проблемой.
Это модель, к которой я хочу написать запрос.
class ReservationFrame(models.Model):
id = models.AutoField(primary_key=True)
start_at = models.DateTimeField(db_index=True)
information = models.JSONField(default=dict)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Поле json (ReservationFrame.information) имеет такой формат
{
upper_age_limit: 22,
lower_age_limit: 30
}
Я хочу вычислить возраст пользователя, вошедшего в систему до ReservationFrame.start_at, и вернуть соответствующий ReservationFrame, если upper_age_limit <= user.age <= lower_age_limit
Формула, которую я использую для расчета возраста, следующая
start_at.year - born.year - ((start_at.month, start_at.day) < (born.month, born.day))
Я использую annotate, но получаю ошибки.
person_birthday = request.user.person.birthday
frames_without_age_limit = reservation_frames.exclude(Q(information__has_key = 'upper_age_limit')&Q(information__has_key = 'lower_age_limit'))
reservation_frames = reservation_frames.annotate(
age=ExtractYear('start_at') - person_birthday.year - Case(When((ExtractMonth('start_at'), ExtractDay('start_at')) < (person_birthday.month, person_birthday.day), then=1), default=0))
reservation_frames = reservation_frames.filter(
Q(information__lower_age_limit__lte = F('age'))|
Q(information__lower_age_limit=None)
)
reservation_frames = reservation_frames.filter(
Q(information__upper_age_limit__gte = F('age'))|
Q(information__upper_age_limit=None)
)
TypeError: '<' не поддерживается между экземплярами 'ExtractMonth' и 'int'
Реляционные операторы, такие как <,>, <=,>=,== не допускаются в условных выражениях Django. Поэтому вы должны реализовать свою логику, используя кверисеты и цепочки условий. Также, вы можете изменить это лексическое сравнение на более простое логическое сравнение. например, так:
(A,B) < (X,Y) ---> (A<X) OR ((A==X) AND (B<Y))
попробуйте так. должно получиться!
reservation_frames = reservation_frames.annotate(
age=ExtractYear('start_at') - person_birthday.year - Case(
When(Q(start_at__month__lt=person_birthday.month)|(Q(start_at__month=person_birthday.month) & Q(start_at__day__lt=person_birthday.day)), then=1),
default=0))