获取.annotate()数据Django的相关专栏

时间:2016-06-19 14:03:09

标签: django django-select-related rawsql

我创建了这个简单的数据集来说明我的观点。这是一个简单的模型,与任何其他模型没有进一步的关系。

enter image description here

我需要按主题对上面的数据进行分组,找到每个组的最大日期,然后找到该日期的作者。

info = TempModel.objects
       .values('topic')
       .annotate( max=Max('date'))
       .order_by('-max')

在模板中迭代,

  <table>
      {% for item in info %}
      <tr>
        <td>{{ item.topicid }}</td>
        <td>{{ item.max }}</td>
        <td>{{ item.author }}</td>
      </tr>
      {% endfor %}
  </table>

产生

enter image description here

如何为每个最大日期显示“作者”列?

我可以使用像这样的原始SQL查询来执行此操作,

info = list(TempModel.objects
       .raw('SELECT *, max(date) AS max 
       FROM crudapp_tempmodel 
       GROUP BY topicid 
       ORDER BY date DESC'))

但我想用Django查询来做。

我正在寻找的输出是,

enter image description here

如果使用Django查询无法做到这一点,我想知道。

谢谢,

1 个答案:

答案 0 :(得分:0)

解决方案是合并另一个查询,该查询将一个查询的日期与另一个查询的最大值进行比较。

这是执行此操作的视图,

def temp(request):
    info2 = TempModel.objects.all()
    info = TempModel.objects
           .values('topic')
           .annotate( max=Max('date'))
           .order_by('-max')

    columnlist = []
    for item in info2:
         columnlist.append([item])

    for item in info:
        for i in range(len(columnlist)):
            if item['max'] == columnlist[i][0].date:
                item['author'] = columnlist[i][0].author

    return render(request, 'template.html', {'info': info, 'info2': info2})