当前在以下查询中,win_rate
将始终默认为0,除非Lost
为0-在这种情况下,win_rate
将变为100。如何正确地允许对聚合字段进行除法运算,同时避免被零 debugging 误?
top_markets = list(opps
.annotate(name=Subquery(Market.objects.filter(id=OuterRef('market'))[:1].values('marketname')))
.order_by('name')
.values('name')
.annotate(opps=Count('id', filter=Q(datecreated__range=(start_date, end_date))),
Won=Count(
'id', filter=Q(winloss='Won') & Q(date_closed__range=(start_date, end_date))),
Lost=Count('id', filter=Q(winloss='Lost') & Q(
date_closed__range=(start_date, end_date))),
Concluded=F('Won') + F('Lost'))
)
.annotate(
win_rate=Case(
When(Won=0, then=0),
default=((F('Won')) / \
(F('Won')) + F('Lost'))) * 100
)
编辑-
添加我的模型。opps
是对模型Opportunity
的预过滤查询:
class Opportunity(models.Model):
name = models.CharField()
winloss = models.CharField()
market = models.ForeignKey(Market, on_delete=SET_NULL)
datecreated = models.DateTimeField(auto_now=True)
1条答案
按热度按时间rsaldnfx1#
将其转换为
FloatField
:话虽如此,我还是不明白为什么要在数据库端这样做:你已经有了won的数量和列表
Opportunity
,所以你可以在Python/Django级别上做这些。此外,请不要使用queryset来生成序列化的数据:使用串行化程序。