python - 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,如果 lower_age_limit <= user.age <= upper_age_limit 返回相应的 ReservationFrame
我用来计算年龄的公式是
start_at.year - born.year - ((start_at.month, start_at.day) < (born.month, born.day))
我正在使用注释但出现错误。
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) 或 ((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))
推荐阅读
- javascript - JSON Schema:非空元素唯一的数组
- java - 如何让带有 Gradle 的 Eclipse 自动生成 spring-configuration-metadata 文件?
- java - 如何在 android 中与 agora.io sdk 共享屏幕?
- html - 我想制作这样的垂直菜单(参见图片以供参考
- javascript - 对象内部的范围 - this
- python - 如何在另一个字符串中间的字符串周围插入引号
- postgresql - 为不同的用户创建多个表是否更有效?
- python - 列表超出模拟范围
- python - 如何使用 Matplotlib 的 .plot(table = True) 移动表格位置
- reactjs - Webstorm 中的 ESLint 无法识别 React 类型