【问题标题】:Django Using order_by with .annotate() and getting related fieldDjango 使用 order_by 和 .annotate() 并获取相关字段
【发布时间】:2016-10-19 20:40:25
【问题描述】:

我有以下数据,

此查询按 topicid 分组,然后在每个组中获取最大日期、帖子频率并计算作者作为贡献者的数量,

    info_model = InfoModel.objects.values('topicid')
            .annotate( max=Max('date'), freq=Count('postid'),                   
             contributors=Count('author', distinct=True))

然后这个查询可以显示如下,

Q.1(已解决)如何按日期从最近开始对行进行排序?我确实将 .order_by('date') 附加到查询中,这似乎是最明显的解决方案,但这会产生,

完全改变“频率”和“贡献”。

编辑:可以通过附加 .order_by('-max') 来实现排序

Q.2 如何显示该日期的“帖子”?所以应该显示帖子列,

是的

再见

淅淅

溜溜球

我认为以下内容应该适用于 {{ item.post }},但没有这样的运气。

  <table class='table table-striped table-hover'>
        <thead>
          <tr>
            <th>freq</th>
            <th>topicid</th>
            <th>date</th>
            <th>contributors</th>
            <th>post</th>
          </tr>
        </thead>
        <tbody>
          {% for item in info %}
          <tr>
            <td>{{ item.freq }}</td>
            <td>{{ item.topicid }}</td>
            <td>{{ item.max }}</td>
            <td>{{ item.contributors }}</td>
            <td>{{ item.post }}</td>
          </tr>
          {% endfor %}
        </tbody>
      </table>

谢谢,

编辑:

我可以使用原始 SQL 获得正确的结果,但无法使用 Django 查询,

info_model = list(InfoModel.objects.raw('SELECT *, 
              max(date),  
              count(postid) AS freq,     
              count(DISTINCT author) AS contributors FROM        
              crudapp_infomodel GROUP BY topicid ORDER BY date DESC'))

我在这里简化并转发了这个问题Rewrite raw SQL as Django query

【问题讨论】:

标签: sql-order-by django-queryset annotate


【解决方案1】:

以下视图合并了两个查询来解决问题,

def info(request):
    info_model = InfoModel.objects.values('topic')
                 .annotate( max=Max('date'), 
                 freq=Count('postid'), 
                 contributors=Count('author', distinct=True))
                 .order_by('-max')

    info2 = InfoModel.objects.all()

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

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

    paginator = Paginator(info_model, 20)
    page = request.GET.get('page')
    try:
        info = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        info = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        info = paginator.page(paginator.num_pages)
    return render(request, 'info.html', {'info': info})

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 2016-10-20
    • 2011-03-10
    • 2016-05-15
    • 2011-04-23
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多