Django queryset如何使用anateate()检索相关字段

时间:2018-08-08 15:24:36

标签: django django-models

我有这张桌子:

id  supply   event_date   value_average
----------------------------------------
1     a      01-01-2018        5
2     b      02-01-2018        6
3     a      02-01-2018        7
4     b      03-01-2018        8
5     c      03-01-2018        9

我试图基于event_date列获取每个耗材的最新值。我可以获得最新的事件,但是我也没有找到返回value_average的方法。

values_average = Purchase.objects \
    .values('supply') \
    .annotate(last=Max('event_date')) \
    .order_by()

当前收益:

a        02-01-2018
b        03-01-2018
c        03-01-2018

预期收益:

a        02-01-2018      7
b        03-01-2018      8
c        03-01-2018      9

2 个答案:

答案 0 :(得分:1)

我通过遵循以下答案找到了一种方法:

Django: select values with max timestamps or join to the same table

values_average = Purchase.objects \
            .filter(farm=farm, supply__in=queryset) \
            .order_by('supply', '-event_date') \
            .distinct('supply')

仅适用于Postgres。最终结果将是带有最新事件的普通查询集。请注意模型是否具有元排序。

Django文档: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct

答案 1 :(得分:0)

我认为您只需要将value_average属性添加到要返回的值即可:

values_average= Purchase.objects.values('supply','value_average').annotate(last=Max('event_date'))