我有一个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),我也不能修改它。
答案 0 :(得分:0)
据我所知,postgres表中你的vistor字段的名称将是" visitor_id"因为它是ForeignKey。它作为整数存储在数据库中。