我在Django中有两个模型。第一个模型是User
,第二个模型是Action
。 Action
具有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)
我正在考虑这样做:
User
模型,这个条件非常复杂,但为了举例说明我只想要超级用户Action
模型的操作,这只是类型等于"like"
的操作。我不想在此过滤用户,只需过滤操作。user_id
对操作进行分组,并为每个用户计算这是我尝试过的:
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更好。