【发布时间】:2016-02-17 02:06:15
【问题描述】:
我有一个 Django 网站,用户可以在其中创建群组,其他用户然后访问群组发布内容。群组可以对公众开放,也可以保持私有。模型很简单:
class Group(models.Model):
topic = models.TextField(validators=[MaxLengthValidator(200)])
owner = models.ForeignKey(User)
private = models.CharField(max_length=5, default=0)
created_at = models.DateTimeField(auto_now_add=True)
class GroupTraffic(models.Model):
visitor = models.ForeignKey(User)
which_group = models.ForeignKey(Group)
time = models.DateTimeField(db_index=True, auto_now_add=True)
你能帮我列出网站上所有组的列表,满足以下规则吗?
1) 我想只显示所有公共群组(即group.private='0')
2) 对于每个组,我想注释它曾经拥有的总观看次数
3) 最后,群组列表应按
为了实现上述目的,这是我尝试过的(请滚动):
date = datetime.now()-timedelta(hours=1)
groups = Group.objects.filter(private='0').annotate(total_views=Count('grouptraffic__visitor')).extra(select={'uniques':'SELECT COUNT (DISTINCT visitor) FROM links_grouptraffic AS grptraffic WHERE (links_grouptraffic.time > %s AND links_grouptraffic.which_group_id=grptraffic.which_group_id)'},select_params=(date,),).order_by('-uniques')
请注意,links 是应用程序的名称。为了满足(1)我使用过滤器,为了满足(2)我注释了一个 Count 聚合,为了满足(3)我在其中使用了一些 SQL。它不起作用;我收到错误:列“访问者”不存在。 但列访问者确实存在 - 查看模型 - 因此我不确定这个错误意味着什么。这是截图;它有更多信息:
您能帮我构建满足 1、2 和 3 的查询吗?我的数据库是 postgres,高效的性能对我来说很关键。
注意:我也是tried this,这很有趣,但解决方案不满足(1),我也无法修改它。
【问题讨论】:
标签: python sql django performance postgresql