Django中如何计算同一外键关联的两个查询集不同字段的日期间隔
Django 同外键跨记录日期差值计算方案
现有代码的问题
- 字段名拼写错误:
F('enrolL_date')多写了大写L,和模型中定义的enroll_date不匹配 - 逻辑不符合数据结构:你当前的写法是计算同一条Feedback记录内两个日期的差值,但你的数据里同一个学生的
injection_date和enroll_date分别存在两条不同的Feedback记录中,单条记录两个字段必有一个为空,自然得不到正确结果
正确实现代码
首先导入需要的ORM方法:
from django.db.models import F, Max, ExtractDay
按学生外键分组后先聚合两个日期,再计算间隔天数:
injection_enroll = Feedback.objects.values("student_id")\ .annotate( # 按学生分组后,取出该学生下非空的接种/报名日期 valid_inject_date = Max("injection_date"), valid_enroll_date = Max("enroll_date") )\ # 提取两个日期差值的天数部分 .annotate( enroll_inject_days = ExtractDay(F("valid_enroll_date") - F("valid_inject_date")) )
结果使用示例
遍历查询结果即可直接拿到每个学生的间隔天数:
for item in injection_enroll: # 输出示例:学生ID 52,间隔天数 3 print(f"学生ID {item['student_id']},间隔天数 {item['enroll_inject_days']}")
拓展:关联查询学生其他信息
如果需要同时拿到学生姓名等Student表的字段,可以用子查询关联Student表:
from django.db.models import OuterRef, Subquery # 子查询:计算对应学生的间隔天数 days_diff_sub = Feedback.objects.filter(student_id=OuterRef("pk"))\ .annotate( inject_date = Max("injection_date"), enroll_date = Max("enroll_date"), diff = ExtractDay(F("enroll_date") - F("inject_date")) ).values("diff") # 直接查询学生表,同时带出间隔天数 student_list = Student.objects.annotate(enroll_inject_diff=Subquery(days_diff_sub))
内容的提问来源于stack exchange,提问作者leesuccess
相关产品推荐
相关产品推荐

