首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:基于注解的注解

Django:基于注解的注解
EN

Stack Overflow用户
提问于 2013-10-26 04:38:42
回答 2查看 2.5K关注 0票数 10

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

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

假设我想计算每支球队球员的平均权重。我想我会这么做:

代码语言:javascript
复制
Team.objects.annotate(avg_weight=Avg(player__weight))

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

EN

回答 2

Stack Overflow用户

发布于 2021-08-28 10:52:56

您可以像这样使用query:

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

将相关名称添加到模型中,如下所示:

代码语言:javascript
复制
class Player(models.Model):
    name = models.CharField()
    weight = models.DecimalField()
    team = models.ForeignKey('Team', related_name="players")
票数 0
EN

Stack Overflow用户

发布于 2022-02-28 03:36:50

我将假设(可能是错误的)您所说的“方差”是指最大权重和最小权重之间的差异。如果是这样,您可以使用单个查询生成多个聚合,如下所示:

代码语言:javascript
复制
from django.db.models import Avg, Max, Min

Team.objects.aggregate(Avg('player__weight'), Max('player__weight'), Min('player__weight'))

这是从django docs on generating aggregation over a queryset中获取的。

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

https://stackoverflow.com/questions/19599043

复制
相关文章

相似问题

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