【问题标题】:Crafting a query to construct a challenging Django queryset制作查询以构建具有挑战性的 Django 查询集
【发布时间】: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) 最后,群组列表应按过去 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。它不起作用;我收到错误:列“访问者”不存在但列访问者确实存在 - 查看模型 - 因此我不确定这个错误意味着什么。这是截图;它有更多信息:

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


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

【问题讨论】:

    标签: python sql django performance postgresql


    【解决方案1】:

    据我所知,您在 postgres 表中的 vistor 字段的名称将是“visitor_id”,因为它是一个外键。它以整数形式存储在数据库中。

    【讨论】:

    • 你的意思是说,正确的查询是:SELECT COUNT (DISTINCT visitor_id) FROM links_grouptraffic AS grptraffic WHERE (links_grouptraffic.time > %s AND links_grouptraffic.which_group_id=grptraffic.which_group_id?
    • 不一样。这次它给了我:“SELECT”处或附近的语法错误(没什么可继续的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    相关资源
    最近更新 更多