Django Использование order_by с .annotate() и получение связанного поля

У меня есть следующие данные,

введите здесь описание изображения

Этот запрос группирует по идентификатору темы, а затем в каждой группе получает максимальную дату, частоту сообщений и подсчитывает количество авторов в качестве участников,

    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 Как я могу отобразить «сообщение» для этой даты? Таким образом, столбец сообщений должен отображаться,

ya

до встречи

Чао

йо Йо

Я думал, что следующее должно работать с {{ 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'))

Я упростил и разместил эту проблему здесь Перепишите необработанный SQL как запрос Django


person Shane G    schedule 17.06.2016    source источник
comment
Я написал решение здесь: джанго">stackoverflow.com/questions/37908049/   -  person Shane G    schedule 20.06.2016


Ответы (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})
person Shane G    schedule 19.06.2016