首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将中值注释为django queryset

如何将中值注释为django queryset
EN

Stack Overflow用户
提问于 2020-01-12 20:48:05
回答 2查看 903关注 0票数 0

我有两个模特儿困惑和玩。每出戏我都有一个评分。我想注释到一个难题,设置所有相应的游戏的中值评级值。

代码语言:javascript
运行
复制
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)

我知道怎么数:

代码语言:javascript
运行
复制
Puzzle.objects.annotate(nb_sucesses=Count('plays', filter = Q(plays__puzzle_completed=True), distinct = True),)

我希望以类似的方式得到中位数:

代码语言:javascript
运行
复制
Puzzle.objects.annotate(rating_median=Median('plays__rating', filter = Q(plays__puzzle_completed=True), distinct = True),)

但是,显然由于我的Django开发环境数据库(sqlite),我无法做到这一点。

根据我从下面的信息environment(MariaDB),中得出的结论,在我的生产https://mariadb.com/kb/en/median/中,这种方法应该可以工作(但我还没有测试它)

我目前的理解(基于不同的互联网搜索)是,我应该能够使用Django ()函数来使用一个定制的中间函数(遵循这个模式?),它可以在生产中调用中位数if,或者在开发中调用更为复杂的sql查询(基于这张吗?这张吗?)。

但几个小时后,我必须承认我在这里已经超出了我的深度。

有人能帮我把点连起来吗?

EN

回答 2

Stack Overflow用户

发布于 2020-01-12 21:12:28

Django中没有中间实现,因为它不是在PostgreSQL中实现的。

您可以将中位数作为原始查询在MariaDB 10.3.3+上运行,也可以在Django中为您的自定义需求编写聚合函数,然后使用ORM将其转换为相同的查询。

您肯定应该在生产和开发环境中使用相同的db类型,以尽量减少由于环境不同而产生的bug(建议也使用诸如docker之类的工具)。

票数 0
EN

Stack Overflow用户

发布于 2020-05-21 15:38:42

关于如何在使用PostgreSQL时做到这一点,请参考我在Django & Postgres -百分位数(中位数)和组的答案。

可以创建一个Median子类的Aggregate,然后它的行为类似于其他聚合函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59707982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档