Django:基于注释进行注释

标签 django orm aggregate-functions

假设我正在使用 Django 来管理关于运动员的数据库:

class Player(models.Model):
    name = models.CharField()
    weight = models.DecimalField()
    team = models.ForeignKey('Team')

class Team(models.Model):
    name = models.CharField()
    sport = models.ForeignKey('Sport')

class Sport(models.Model):
    name = models.CharField()

假设我想计算每支球队球员的平均体重。我想我会这样做:
Team.objects.annotate(avg_weight=Avg(player__weight))

但是现在说我想计算每项运动中团队权重的方差。有没有办法使用 Django ORM 做到这一点?如何使用extra() QuerySet 上的方法?非常感谢任何建议。

最佳答案

您可以使用这样的查询:

class SumSubquery(Subquery):
    template = "(SELECT SUM(`%(field)s`) From (%(subquery)s _sum))"
    output_field = models.Floatfield()
    def as_sql(self, compiler, connection, template=None, **extra_context):
        connection.ops.check_expression_support(self)
        template_params = {**self.extra, **extra_context}
        template_params['subquery'], sql_params = self.queryset.query.get_compiler(connection=connection).as_sql()
        template_params["field"] = list(self.queryset.query.annontation_select_mask)[0]
        sql = template % template_params
        return sql, sql_params



Team.objects.all().values("sport__name").annotate(variance=SumSubquery(Player.objects.filter(team__sport_id=OuterRef("sport_id")).annotate(sum_pow=ExpressionWrapper((Avg("team__players__weight") - F("weight"))**2,output_field=models.Floatfield())).values("sum_pow"))/(Count("players", output_field=models.FloatField())-1))
并将相关名称添加到模型中,如下所示:
class Player(models.Model):
    name = models.CharField()
    weight = models.DecimalField()
    team = models.ForeignKey('Team', related_name="players")

关于Django:基于注释进行注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19599043/

相关文章:

c# - 在 Habanero 中,我将如何限制从数据库返回的对象数量

django debug false 和内部服务器错误

django - 创建 dockerfile 以构建新图像

python - 如何配置 Django 在 MSSQL Server 上运行

Python 正在向后打印一个列表,但不打印其他列表

java - 配置新数据库时 Speedment 会删除生成的代码

Django用count过滤多对多关系

postgresql - 在 postgresql 中对 array_agg 进行子选择

python - 如何将聚合函数应用于 Pandas 中数据透视表的所有列

r - 在 reshape2 中使用 min 或 max 时没有非缺失参数警告