问题 Django ORM:Group by和Max


我有一个看起来像这样的模型:

Requests: user, req_time, req_text

在DB中,记录可能如下所示:

id, user_id, req_time, req_text
1     1      TIMESTAMP  YES
2     1      TIMESTAMP  NO
3     2      TIMESTAMP  YES

等等

如何编写Django ORM查询:按用户对请求进行分组,根据req_text过滤请求,还选择结果结果集的最大ID。因此,对于每个用户,我将返回一行符合过滤条件并且具有最大id。


2767
2017-08-04 11:02


起源



答案:


from django.db.models.aggregates import Max

request_values = Requests.objects.filter(req_text='YES') \
                 .values('user') \
                 .annotate(max_id=Max('id'))

然后 request_values 将如下所示:

[
    {'user': 1, 'max_id': 1},
    {'user': 2, 'max_id': 4},
    {'user': 3, 'max_id': 5},
    {'user': 4, 'max_id': 12},
    ...
]

10
2017-08-04 15:26



type(request_values)== django.db.models.query.ValuesQuerySet但是ValuesQuerySet的元素是字典而不是Django对象。有没有办法从该查询中获取QuerySet? - kev
@kev从GROUP BY查询中请求模型实例是没有意义的,因为结果的每一行都不再代表表中的一行 - Anentropic
是的,这绝对有道理 - kev


答案:


from django.db.models.aggregates import Max

request_values = Requests.objects.filter(req_text='YES') \
                 .values('user') \
                 .annotate(max_id=Max('id'))

然后 request_values 将如下所示:

[
    {'user': 1, 'max_id': 1},
    {'user': 2, 'max_id': 4},
    {'user': 3, 'max_id': 5},
    {'user': 4, 'max_id': 12},
    ...
]

10
2017-08-04 15:26



type(request_values)== django.db.models.query.ValuesQuerySet但是ValuesQuerySet的元素是字典而不是Django对象。有没有办法从该查询中获取QuerySet? - kev
@kev从GROUP BY查询中请求模型实例是没有意义的,因为结果的每一行都不再代表表中的一行 - Anentropic
是的,这绝对有道理 - kev