Django 在 .annotate() 中使用 order_by 并获取相关字段
Django Using order_by with .annotate() and getting related field
我有以下数据,
此查询按 topicid 分组,然后在每个组中获取最大日期、posts 的频率并计算作为贡献者的作者数量,
info_model = InfoModel.objects.values('topicid')
.annotate( max=Max('date'), freq=Count('postid'),
contributors=Count('author', distinct=True))
这个查询可以显示如下,
Q.1(已解决)如何按日期从最近的向下排列行?我确实将 .order_by('date') 附加到查询中,这似乎是最明显的解决方案,但这会产生,
完全改变 'freq' 和 'contributions'。
编辑:可以通过附加 .order_by('-max')
来实现排序
Q.2 如何显示该日期的 'post'?所以 post 列应该显示,
是的
再见
再见
溜溜球
我认为以下内容应该适用于 {{ 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'))
我在这里简化并重新post解决了这个问题
下面的视图合并了两个查询来解决问题,
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})
我有以下数据,
此查询按 topicid 分组,然后在每个组中获取最大日期、posts 的频率并计算作为贡献者的作者数量,
info_model = InfoModel.objects.values('topicid')
.annotate( max=Max('date'), freq=Count('postid'),
contributors=Count('author', distinct=True))
这个查询可以显示如下,
Q.1(已解决)如何按日期从最近的向下排列行?我确实将 .order_by('date') 附加到查询中,这似乎是最明显的解决方案,但这会产生,
完全改变 'freq' 和 'contributions'。
编辑:可以通过附加 .order_by('-max')
来实现排序Q.2 如何显示该日期的 'post'?所以 post 列应该显示,
是的
再见
再见
溜溜球
我认为以下内容应该适用于 {{ 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'))
我在这里简化并重新post解决了这个问题
下面的视图合并了两个查询来解决问题,
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})