如何在Django的一个查询中计算字段和同一字段但已过滤?

时间:2015-03-20 22:30:29

标签: python django

我真的不是一个网络开发者,所以很抱歉我的问题的标题并不合理。

为了方便起见,这是我的模型的样子(我为示范剥离了非必要的字段):

class User(models.Model):
    username = models.CharField(max_length=100)
class Vote(models.Model):
    user = models.ForeignKey(AskFmUser)
    date = models.DateTimeField('vote date')

在一个视图中,我需要列出所有用户,他们收到的投票数,按投票排序。使用此查询我没有问题:

global_votecount = Vote.objects.all().values('user', 'user__username').annotate(votesTotal=Count('user__username')).order_by('-votesTotal')

在我的模板中,我将它显示在一个包含两列(用户名和投票计数)的表上。

但我需要做的是显示他们一直收到的总投票数,而且,在同一个HTML表格中,显示他们今天收到的投票名称。

我知道我可以通过此查询获得今天的投票:

now = timezone.now()
today_votecount = Vote.objects.filter(date__year=now.year, date__month=now.month, date__day=now.day).values('user', 'user__username').annotate(todayVotesCount=Count('user__username')) 

但问题是如果在白天没有为特定用户投票,他就不会出现在列表中。此外,即使以order_by订购,该列表也会以不同方式排序。

所以...你看到任何"清洁"解决方案是能够在单个查询中获得一个时间段的总投票数和投票数(通过在" date"字段中过滤)? 如果不可能......我可以手动通过这两个ValuesQuerySet在第一个中添加一个字段(对应于"今天投票数",当在第二个中找到用户名时?

谢谢

1 个答案:

答案 0 :(得分:1)

我不确定如何在一个查询中执行此操作,但请考虑以下内容:

global_votecount = Vote.objects.all().values('user', 'user__username').annotate(votesTotal=Count('user__username')).order_by('-votesTotal')

import datetime
today_min = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
today_max = datetime.datetime.combine(datetime.date.today(), datetime.time.max)

votesToday = dict(Vote.objects.filter(date__range=(today_min, today_max)).values_list('user__username').annotate(votesToday=Count('user__username')))


for item in global_votecount:
    item['votesToday'] = votesToday[item['user__username']]

这使用两个查询,并获取第二个查询的结果并将其应用于第一个查询的结果。