Django注释与铸造变量

Django注释与铸造变量,django,django-models,group-by,django-queryset,django-annotate,Django,Django Models,Group By,Django Queryset,Django Annotate,我想用django queryset实现一些复杂的功能。 我的模型如下所示: class Mymodel(models.Model): #Model Variables year = models.IntegerField() month = models.IntegerField() date = models.DateField(_("Date"), default=datetime.date.today) score = models.CharFie

我想用django queryset实现一些复杂的功能。 我的模型如下所示:

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)
不幸的是

分数“不能从CharField()更改为FloatField())

,则应将其保留为字符串

我需要的是按年份和月份将所有分数相加。我尝试了类似的方法来分组所有分数,但没有取得很大成功

values = Mymodel.objects.all().values(
    'year', 'month').annotate(Sum('score')).order_by('year', 'month')
在使用annotate之前,我试图通过这样做来转换“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')

您为什么要使用
charfield
?如果某个对象是数值对象,请将其存储在数值类型对象中。使用
CharField
s进行建模是很糟糕的。你是对的,但我现在不能更改它,因为我可能会破坏很多工作特性。这段代码返回我的几个对象的月份相同,例如a)'year':2018,'sumscore':5,'month':4b)'year':2018,'sumscore':3,'month':5c)'year':2018,'sumscore':7,“月”:5只要b和c属于同一个月,我就想这样:a“年”:2018,“月”:5,“月”:4 b“年”:2018,“月”:10,“月”:5(以前的b+c)不幸的是,铸造不起作用,我得到的输出与以前完全相同。如果我将分数从char改为float,即使没有施法(显然),queryset也能正常工作。所以我别无选择,分数改为浮动。奇怪,我生成测试数据,一切正常,请在问题中添加代码生成数据,就像你的一样。回答是对的,我的错。只是忘记更改第一个注释中的名称。现在可以了。很高兴能帮助你!