【问题标题】:Django queryset How to retrieve related fields with annotate()Django queryset 如何使用 annotate() 检索相关字段
【发布时间】:2019-01-15 22:27:24
【问题描述】:

我有这张桌子:

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

【问题讨论】:

    标签: django django-models


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果我添加 value_average,结果查询也会按 value_average 分组,并给我错误的结果。有 value_average: ...GROUP BY "event_event"."supply_id", "event_event"."value_average" 没有 value_average: ...GROUP BY "event_event"."supply_id"
      • 我不确定我是否理解您,但您是否尝试按供应分组?像这样: values_average= Purchase.objects.values('supply','value_average').annotate(last=Max('event_date')).groupby('suply')
      • 据我所知,ORM 中不存在 .groupby() 。要按某些内容进行分组,我们必须使用 values()。 docs.djangoproject.com/en/2.1/topics/db/aggregation/#values 请,如果我遗漏了什么,你能指出与它相关的文档吗?
      猜你喜欢
      • 2016-10-19
      • 2013-07-29
      • 1970-01-01
      • 2020-01-09
      • 2011-04-23
      • 2013-07-30
      • 2013-03-06
      • 2022-06-17
      • 2022-12-04
      相关资源
      最近更新 更多