Django ORM与GROUP BY和SUM连接

时间:2015-06-05 23:54:35

标签: python django django-orm django-1.8

我正在使用Django 1.8。

我有User模型和UserAction模型。用户有类型。 UserAction有一个时间,表示动作花了多长时间。它们看起来像这样:

class User(models.Model):
   user_type = models.IntegerField()

class UserAction:
   user = models.ForeignKey(User)
   time = models.IntegerField()

现在我要做的是让某个类型的所有用户以及他们的行动时间总和。所以它看起来像这样:

{user:1,total_time=5000}, {user:2,total_time=230}, {user:3,total_time=0}

鉴于我在名为type的var中有所需的类型,我所做的是:

UserAction.objects.filter(user__type=type)
.values('user').annotate(total_time=Sum(time))

这几乎可以满足我的需要但它不包括给定类型的用户没有任何与之关联的UserAction,在这种情况下我希望total_time只有0.我&#39我一直在做一些搜索,但我不太确定我会怎么做。我知道如何在原始SQL中执行此操作(只需执行左连接),但Django ORM对我来说仍然是一个新手。任何人都可以指出我在正确的方向吗?非常感谢任何建议!

1 个答案:

答案 0 :(得分:2)

User.objects.filter(user_type=type).values('id').annotate(total_time=Sum(useraction__time))