具有挑战性的Django查询集构造,过滤和排序

时间:2015-11-17 13:41:59

标签: python django django-queryset

我在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”是额外的日期时间对象)

1 个答案:

答案 0 :(得分:-1)

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

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

firefox&

P.S。我不测试这段代码。只是一个例子。