2016-06-17 3 views
0

У меня есть следующие данные,Джанго Использование order_by с .annotate() и получение связанных с поля

enter image description here

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

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

Этот запрос затем может отображаться следующим образом,

enter image description here

Q.1 (SOLVED) Как я могу упорядочить строки по дате, от самых последних? Я приложил .order_by («дата») на запрос, который кажется наиболее очевидным решением, но это производит,

enter image description here

полностью изменяя «частота» и «вклад».

EDIT: упорядочение может быть достигнуто путем добавления .order_by («-») макс

В.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> 

Спасибо,

Edit:

я могу получить правильный результат с сырым SQL, но не может это сделать WTH запрос 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

+0

Я написал решение здесь http://stackoverflow.com/questions/37908049/get-related-column-on-annotate-data-django/37911943#37911943 –

ответ

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})