制作查询以构建具有挑战性的Django查询集

时间:2015-11-16 02:11:05

标签: python sql django performance postgresql

我有一个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)最后,群组列表应按过去1小时内唯一身份访问者的数量排序

为实现上述目标,这就是我尝试过的(请滚动):

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。它不起作用;我收到错误:列“访客”不存在但是列访问者存在 - 请参阅模型 - 因此我不确定此错误的含义。这是一个截图;它有更多信息: enter image description here

你能帮我构建满足1,2和3的查询吗?我的数据库是postgres,高效的性能对我来说很关键。

注意:我也tried this,它很有趣,但解决方案不满足(1),我也不能修改它。

1 个答案:

答案 0 :(得分:0)

据我所知,postgres表中你的vistor字段的名称将是" visitor_id"因为它是ForeignKey。它作为整数存储在数据库中。