首页 > 解决方案 > 按另一个字段的最大值聚合

问题描述

嘿,我有一个名为Visit. 带字段date, person, id. 我想得到所有在过去三个月内没有访问过的人。你能帮我吗?

到目前为止我所拥有的。结果不是我想看到的。

visits_anotated = Visit \
    .objects \
    .only('id', 'date', 'person') \
    .values('id', 'date', 'person') \
    .annotate(latest_visit=Max('date')) \
    .filter(latest_visit__lte=datetime.datetime.now() - datetime.timedelta(weeks=14)) 

标签: djangodjango-models

解决方案


我不相信你需要为此做一个汇总。您应该能够过滤到过去三个月访问过的人,然后找到所有其他人。

three_months_ago = datetime.datetime.now() - datetime.timedelta(weeks=14)
recent_people = Visit.objects.filter(
    date__gte=three_months_ago
).values('person').distinct()
earlier_people = Visit.objects.exclude(
    person__in=recent_people
).values('person').distinct()

如果 person 是外键,你可以这样做:

Person.objects.exclude(visit_set__date__gte=three_months_ago).distinct()

推荐阅读