Django:按过滤外键的计数排序

时间:2014-03-25 13:59:12

标签: python sql django django-orm

我在Django中有两个模型。第一个模型是User,第二个模型是ActionAction具有User的外键。 基本上我想做的是让用户根据他们做了多少喜欢(行动)来排序。

我不想改变模型,因为我有另外一个功能。

class User(models.Model):
    is_superuser = models.BooleanField(default=False)
    ...

class Action(models.Model):
    TYPES = (
        ("like", "User liked something"),
        ("comment", "User commeted on something"),
    )
    user = models.ForeignKey('User')
    action = models.CharField(max_lenght=20, choices=TYPES)

我正在考虑这样做:

  1. 我需要在某些条件下过滤User模型,这个条件非常复杂,但为了举例说明我只想要超级用户
  2. 然后我想只为每个用户提供Action模型的操作,这只是类型等于"like"的操作。我不想在此过滤用户,只需过滤操作。
  3. 我想按user_id对操作进行分组,并为每个用户计算
  4. 然后我想使用计数来订购用户
  5. 这是我尝试过的:

        users = User.objects.filter(is_superuser=True)
        actions = Action.objects.filter(action="like", user_id__in=users).values('user') \
                                .annotate(action_count=models.Count('user'))
    

    不知道接下来该做什么。也许是这样的:

    users.extra(select={'user_actions': actions}).order_by('user_actions')
    

    但这不起作用并导致ProgrammingError: syntax error at or near "["

    编辑:

    为了更清楚地说明这是我想要做的等价的SQL:

    SELECT * FROM user 
    INNER JOIN (SELECT action.user_id, COUNT(action.user_id) as action_count FROM action 
    WHERE action.action = "like" GROUP BY action.user_id) as ac
    ON user.id = ac.user_id WHERE user.is_superuser = 1 ORDER BY ac.action_count DESC;
    

    但是我不想使用SQL,因为User模型上的条件极其复杂并且包含其他连接,因此使用ORM更好。

0 个答案:

没有答案