【发布时间】:2020-04-29 15:45:16
【问题描述】:
我有 2 个模型 Puzzle and Play。对于每场比赛,我都有一个评分。 我想在拼图查询集中注释所有相应播放的中值评分。
class Puzzle(models.Model):
name = models.CharField(max_length=255)
class Play(models.Model):
puzzle = models.ForeignKey(Puzzle, on_delete=models.CASCADE,related_name='plays')
rating = models.IntegerField(default=-1)
puzzle_completed = models.BooleanField(default=None, blank=False, null=False)
我会数数:
Puzzle.objects.annotate(nb_sucesses=Count('plays', filter = Q(plays__puzzle_completed=True), distinct = True),)
我希望以类似的方式获得中位数:
Puzzle.objects.annotate(rating_median=Median('plays__rating', filter = Q(plays__puzzle_completed=True), distinct = True),)
但是,显然由于我的 Django 开发环境数据库 (sqlite),我无法做到这一点。
根据我从以下信息https://mariadb.com/kb/en/median/ 推断,在我的生产环境(MariaDB)中,这种方法应该可以工作(但我还没有测试过)
我目前的理解(基于不同的互联网搜索)是我应该能够使用 Django Func() 函数来使用自定义 Median 函数 (following that model ?),如果在生产中调用 Median,或者更复杂sql 原始查询是否处于开发阶段(基于 on this one ? 或 on this one?)。
但几个小时后,我必须承认我在这里超出了我的深度。
谁能帮我把这些点联系起来?
【问题讨论】:
-
Median是,据我所知,不是 SQL 聚合函数:stackoverflow.com/a/942940/67579 -
它在 MariaDB 10.3.3 中可用,但在 MySQL 8 中(还没有)。
标签: sql django sqlite mariadb django-annotate