我真的不是一个网络开发者,所以很抱歉我的问题的标题并不合理。
为了方便起见,这是我的模型的样子(我为示范剥离了非必要的字段):
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在第一个中添加一个字段(对应于"今天投票数",当在第二个中找到用户名时?
谢谢
答案 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']]
这使用两个查询,并获取第二个查询的结果并将其应用于第一个查询的结果。