我在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分钟内看到的唯一身份访问者排序?那些看不到太多(或任何)动作的聊天室将排在最后,那些行动最多的聊天室将排在最前面; ALL将被列出。
尝试以下,徒劳:
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”是额外的日期时间对象)
答案 0 :(得分:-1)
您需要使用agregation功能。 (称为聚合和注释) 你可以在这里读到它。 https://docs.djangoproject.com/en/1.8/topics/db/aggregation/
主要想法是: 您不能像在虚拟字段中那样思考您在许多其他字段上收集(聚合)的数据,并在以后使用该虚拟字段,就像其他字段一样。
firefox&
P.S。我不测试这段代码。只是一个例子。