10

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 で使用するのはどうですか? どんなアドバイスでも大歓迎です。

4

2 に答える 2

0

次のようなクエリを使用できます。

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")
于 2021-08-28T10:52:55.510 に答える