如何获取 Django 查询集中特定值的平均值

问题描述 投票:0回答:1

我有两个模型“团队”和“成员”。

Members 中的一个字段是“favorite_team”,Teams 中的一个字段是“favorite_avg”

我试图通过输入一个值来获取 favorite_team 字段的平均值。

我正在尝试找到更好/更快的方法来做到这一点:

    all_members = Members.objects.all().count()
    giants_fans = Members.objects.filter(favorite_team='New York Giants').count()

    team = Teams.objects.get(name='New York Giants')
    team.favorite_avg = giants_fans/all_members
    team.save()
python django django-queryset aggregate-functions
1个回答
0
投票

我认为将 Members.favorite_team 的模型设计为 Teams 模型的外键而不是 CharField 会更好。这将使注释/聚合数据变得更容易,并且团队名称的更改不需要更改所有成员 favorite_team CharField。 但对于您当前的型号,您可以使用

Subquery
Cast

from django.db.models import Count, Subquery, OuterRef, FloatField
from django.db.models.functions import Cast

members_count = Members.objects.count()

Teams.objects.update(
    favorite_avg=Cast(
        Subquery(
            Members.objects.filter(favorite_team=OuterRef('name'))
            .values('favorite_team')
            .annotate(count_members=Count('favorite_team'))
            .values('count_members')
        ),
        FloatField(),
    )
    / members_count
)

这将更新您的所有团队,其中最喜爱的特定团队的成员数量为members_count

© www.soinside.com 2019 - 2024. All rights reserved.