两个注释之间的分隔



我正在创建这两个注释,如下所示:

cs = Champion.objects.all()
total_games = Match.objects.all().count()
cs = cs.annotate(
picked_games=Count(
expression='participants__match__id',
filter=Q(participants__role='BOTTOM'),
distinct=True
),
total_games=Value(str(total_games), output_field=IntegerField())
)

在这里之前一切都很好。我获取具有正确结果的picked_gamestotal_games

>>> cs.get(name='Jhin').picked_games
27544
>>> cs.get(name='Jhin').total_games
97410

然而,如果我试图将一个除以另一个:

cs = cs.annotate(
pick_rate=ExpressionWrapper(
expression=F('picked_games') / F('total_games'),
output_field=FloatField()
)
)

这将导致0:

>>> cs.get(name='Jhin').pick_rate
0.0

我不明白这里出了什么问题。。

如果从外部对它们进行除法,我可以得到结果,那么为什么我不能在整个查询集的另一列上得到结果呢?

>>> cs.get(name='Jhin').picked_games / cs.get(name='Jhin').total_games
0.28319474386613286

在进行除法之前,您应该将分子(或分母(强制转换为浮点,否则PostgreSQL数据库将使用整数除法,从而截断为零。因此,您可以使用:

from django.db.models import Count, F, FloatField, Q
from django.db.models.functions importCast
total_games = Match.objects.all().count()
Champion.objects.annotate(
picked_games=Count(
expression='participants__match__id',
filter=Q(participants__role='BOTTOM'),
distinct=True
)
).annotate(
pick_rate=Cast('picked_games', output_field=FloatField())/ total_games
)

最新更新