我在Django有一个网站,用户创建聊天室,然后访问上述聊天室。这样的聊天室可以向公众开放,也可以是私人的。简单的模型如下:
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分钟中看到的唯一访问者进行排序?那些没有看到多少(或任何)动作的聊天室将被排在最后,那些动作最多的将会在上面,所有的都会被列出。
以下几次尝试都是徒劳的:
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对象)
发布于 2015-11-17 14:10:53
您需要使用增益功能。(称为聚合和注释)您可以在这里阅读它。https://docs.djangoproject.com/en/1.8/topics/db/aggregation/
的主要思想是:在许多其他字段上收集(聚合)数据时,不能像虚拟字段那样思考,以后再使用虚拟字段,就像其他字段一样。
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')附注:我不测试这段代码。举个例子。
https://stackoverflow.com/questions/33758447
复制相似问题