首页 > 解决方案 > Django 使用转换变量进行注释

问题描述

我想用 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' 不能从 CharField() 更改为 FloatField()

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

我需要的是按年份和月份汇总所有分数。我尝试了这样的方法来对所有分数进行分组,但没有取得很大成功。

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

在使用注释之前,我尝试通过这样做来投射“分数”。

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

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

有什么建议么?

标签: djangodjango-modelsgroup-bydjango-querysetdjango-annotate

解决方案


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

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')

推荐阅读