编程语言
首页 > 编程语言> > python-Django queryset和GROUP BY

python-Django queryset和GROUP BY

作者:互联网

我在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)

解决方法:

查询集中没有高级group_by.它在调用中用于汇总和注释,但您不可用.

有一个根本没有记录的低级API.您可以获得内部查询描述:

queryset = ... #whatever query you'd want to group by
query = queryset.query

然后您可以通过添加要分组的字段来更改group_by成员(这是一个列表):

query.group_by.append('a_field')

但:

>您必须认真了解自己在做什么.
>不能保证此API的稳定性.

当前的替代方法是回退到原始(django.db.connection.*方法)SQL查询.

编辑:我刚刚看到this 3rd-party application可以帮助您的报告.我不知道您是否可以使用代码中的报告,或者您必须限制自己查看视图中的报告(即:不知道您是否可以用代码处理报告还是将其作为最终结果).

标签:django-queryset,python,django
来源: https://codeday.me/bug/20191029/1958287.html