【发布时间】:2013-01-28 04:29:22
【问题描述】:
我需要在一个简单的消息传递系统中填写一个包含用户活动摘要的模板。对于每个消息发件人,我想要发送的消息数量和不同收件人的数量。
这是模型的简化版本:
class Message(models.Model):
sender = models.ForeignKey(User, related_name='messages_from')
recipient = models.ForeignKey(User, related_name='messages_to')
timestamp = models.DateTimeField(auto_now_add=True)
这是我在 SQL 中的做法:
SELECT sender_id, COUNT(id), COUNT(DISTINCT recipient_id)
FROM myapp_messages
GROUP BY sender_id;
我一直在阅读有关 ORM 查询中聚合的文档,虽然 annotate() 可以处理第一个 COUNT 列,但我看不到获得 COUNT(DISTINCT) 结果的方法(甚至是额外的(select= {}) 没有工作,虽然看起来应该)。这可以翻译成 Django ORM 查询还是我应该坚持使用原始 SQL?
【问题讨论】:
-
.distinct()过滤器可能会派上用场。 -
如果我们忽略 COUNT(DISTINCT recipient_id),使用 annotate 和 Count 函数非常简单。在这里,django 的 distinct() 没有帮助。我认为不可能将这两件事(注释和不同)整合在一起。我猜你必须写两个查询。