首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >挑战Django查询集构造、筛选和排序

挑战Django查询集构造、筛选和排序
EN

Stack Overflow用户
提问于 2015-11-17 13:41:58
回答 1查看 84关注 0票数 1

我在Django有一个网站,用户创建聊天室,然后访问上述聊天室。这样的聊天室可以向公众开放,也可以是私人的。简单的模型如下:

代码语言:javascript
复制
class ChatRoom(models.Model):
    owner = models.ForeignKey(User)
    private = models.CharField(max_length=5, default=0)
    created_at = models.DateTimeField(auto_now_add=True)

class RoomTraffic(models.Model):
    visitor = models.ForeignKey(User)
    which_room = models.ForeignKey(ChatRoom)
    time = models.DateTimeField(db_index=True, auto_now_add=True)

我怎样才能获得所有公共聊天室(chatroom.private='0')的列表,并按在前60分钟中看到的唯一访问者进行排序?那些没有看到多少(或任何)动作的聊天室将被排在最后,那些动作最多的将会在上面,所有的都会被列出。

以下几次尝试都是徒劳的:

代码语言:javascript
复制
date = datetime.now()-timedelta(hours=1)
articles = ChatRoom.objects.filter(private='0').extra(select = {
  "views" : """
  SELECT COUNT(*)
  FROM myapp_roomtraffic
    JOIN myapp_chatroom on myapp_roomtraffic.which_room_id = myapp_chatroom.id
  WHERE myapp_roomtraffic.visitor_id = myapp_user.id
  AND myapp_roomtraffic.time > %s """ % date,
}).order_by("-views")

这个简单的返回错误:语法错误在"00"或"00“(其中”00“是datetime对象)

EN

回答 1

Stack Overflow用户

发布于 2015-11-17 14:10:53

您需要使用增益功能。(称为聚合和注释)您可以在这里阅读它。https://docs.djangoproject.com/en/1.8/topics/db/aggregation/

的主要思想是:在许多其他字段上收集(聚合)数据时,不能像虚拟字段那样思考,以后再使用虚拟字段,就像其他字段一样。

代码语言:javascript
复制
from django.db.models import Count

last_hour_delta = datetime.now()-timedelta(hours=1)

ChatRoom.objects.annotate(visitors_count=Count('room_traffic__visitor')).filter(private=False).filter(created_at__gt=last_hour_delta).order_by('-visitors_count')

附注:我不测试这段代码。举个例子。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33758447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档