我在使用django查询集和GROUP BY查询时,我知道有很多类似的问题,但我真的不明白:/
我希望能够创建一个与此类似的请求(SQLite):
SELECT MAX(fb_game_score.value), fb_game_fbuser.first_name, fb_game_fbuser.last_name
FROM fb_game_score
JOIN fb_game_game ON (fb_game_score.game_id = fb_game_game.id)
JOIN fb_game_fbuser ON (fb_game_game.user_id = fb_game_fbuser.id)
GROUP BY fb_game_fbuser.fb_user_id;
查询非常简单,它通过仅显示每位玩家的最佳得分来列出用户得分。
为了澄清模型类:
class FBUser(AbstractUser):
fb_user_id = models.CharField(max_length=100, null=True)
oauth_token = models.CharField(max_length=1024, null=True)
expires = models.IntegerField(null=True)
highest_score = models.IntegerField(null=True)
class Game(models.Model):
identifier = models.CharField(max_length=100, db_index=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='games')
class Score(models.Model):
game = models.ForeignKey(Game, related_name='scores')
value = models.IntegerField()
date = models.DateTimeField(auto_now=True)
timestamp = models.FloatField(default=0)
inter = models.BooleanField(default=False)
答案 0 :(得分:4)
查询集中没有高级group_by
。它用于拨打aggregate
和annotate
,但您无法使用。
有一个低级API,根本没有记录。您可以获得内部查询说明:
queryset = ... #whatever query you'd want to group by
query = queryset.query
然后你可以通过添加一个你想要分组的字段来改变group_by
成员 - 这是一个列表:
query.group_by.append('a_field')
可是:
目前的替代方案是回退到原始(django.db.connection.*
方法)SQL查询。
修改:我刚看到this 3rd-party application可以帮助您处理报告。我不知道您是否可以使用代码内报告,或者您必须将自己限制在视图内报告中(即:不知道您是否可以在代码中处理报告或仅将其作为最终结果)。