Django 用铸造变量注释

Django annotate with casted variable

我想用 Django 查询集实现一些复杂的东西。 我的模型如下所示:

class Mymodel(models.Model):
    #Model Variables
    year = models.IntegerField()
    month = models.IntegerField()
    date = models.DateField(_("Date"), default=datetime.date.today)
    score = models.CharField(max_length=50)

不幸的是,

score' can't change from CharField() to FloatField()

,它应该保留为一个字符串。

我需要的是按年和月对所有分数求和。我尝试过类似的方法来对所有分数进行分组,但没有取得太大的成功。

values = Mymodel.objects.all().values(
    'year', 'month').annotate(Sum('score')).order_by('year', 'month')

我试图通过这样做在使用注释之前投射 'score'。

values = Mymodel.objects.all().annotate(
        scoreFloat=Cast('score', FloatField())
    ).values('year', 'month').annotate(
        Sum('scoreFloat')).order_by('year', 'month')

再次没有成功,因为我收到 scoreFloat 参数的 KeyError。

有什么建议吗?

在您的第二个查询中,您应该将第一个注释中的新字段添加到值中:

Mymodel.objects.annotate(as_float=Cast('score', FloatField())
    ).values('year', 'month', 'as_float'
    ).order_by('year', 'month'
    ).annotate(sumscore=Sum('as_float')).values('year', 'month', 'sumscore')