我有两个模型“团队”和“成员”。
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()
我认为将 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