【问题标题】:Group by in Django ORM在 Django ORM 中分组
【发布时间】:2014-12-26 22:50:58
【问题描述】:

我想在我的应用中获取 2 个用户之间的“聊天”数量,并且我有一个名为“消息”的表格,其中包含:

sender_user | reciever_user | contain | date

我想做一个查询,为我提供 2 个不同用户之间的所有消息,我知道在 SQL 中我需要使用 GROUP BY,但是如何使用 Django ORM 获取消息列表?你有什么想法吗?

注意:sender_userreciever_userUser 表的实例)

【问题讨论】:

  • 关注这个 - stackoverflow.com/questions/629551/… 这可能是您问题的解决方案
  • 是的,我试过了,但我想在一个对象中获取收件人和发件人的信息,而不仅仅是 id 和记录数。你有什么想法吗?
  • 不,因为我涉及到 request.user 的“聊天”(2 个用户之间的消息)列表是什么,所以你说的“WHERE”只给我一个“聊天”。跨度>

标签: python django orm group-by aggregate


【解决方案1】:

在所描述的情况下,您不需要“GROUP BY”。您需要过滤发送者和接收者用户——它相当于 SQL 的“WHERE”子句。您还可以按日期订购。

Message.objects.filter(sender_user='sender', receiver_user='receiver')

【讨论】:

  • 我想我并不是很具体。如果我这样做,我只会得到我和其他人的“聊天”。我想获得我参与的所有聊天记录。
  • 然后根据您需要的用户使用 sender_user 或 receiver_user。按发送者用户和接收者用户对结果进行排序。您已指定任何需要分组的要求。
  • 是的,但这会给我所有的“消息”,我只想要“聊天”,因为我想在 html 的列表中显示所有聊天。
【解决方案2】:

您可以使用查询集的注释方法。 anotate 方法是 django 中 group by 子句的抽象。

您的查询应该是这样的:

User.objects.filter(message_set__sender=me).annotate(message_count=Count('message'))

参考:https://docs.djangoproject.com/en/1.7/topics/db/aggregation/#order-of-annotate-and-filter-clauses

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2017-03-30
    • 1970-01-01
    • 2012-04-26
    • 2018-03-10
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多