Django 使用转换变量进行注释

Posted

技术标签:

【中文标题】Django 使用转换变量进行注释【英文标题】:Django annotate with casted variable 【发布时间】:2018-12-04 11:14:45 【问题描述】:

我想用 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。

有什么建议吗?

【问题讨论】:

你为什么还要使用charfield?如果某物是数字的,则将其存储在数字类型对象中。使用CharFields 进行建模是很糟糕的。 你是对的,但我现在不能改变它,因为我可能会破坏很多工作功能。 【参考方案1】:

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

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

【讨论】:

这段代码返回我的几个对象,例如 a) 'year': 2018, 'sumscore': 5, 'month': 4 b) 'year': 2018, 'sumscore ': 3, 'month': 5 c) 'year': 2018, 'sumscore': 7, 'month': 5 只要 b 和 c 属于同一个月,我希望以某种方式成为这样:a) 'year ': 2018, 'sumscore': 5, 'month': 4 b) 'year': 2018, 'sumscore': 10, 'month': 5(之前的 b+c) 不幸的是,铸造不起作用,我得到的输出与以前完全相同。如果我将分数从 char 更改为 float,即使没有强制转换(显然),查询集也可以正常工作。所以这让我别无选择,分数改为浮动。 奇怪,我生成了测试数据,一切正常,请在问题中添加代码以生成像你这样的数据 是的,你是对的,我的错。只是忘记在第一个注释中更改名称。现在可以使用了。 很高兴为您提供帮助!

以上是关于Django 使用转换变量进行注释的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE03-注释标识符变量类型类型转换

字面量注释变量数据类型数据类型转换

Django:根据字段的状态对 Sum Case 进行注释

如何将 django 变量正确转换为模板中的 json

Java基础

Eclipse-运行符-数据类型转换-环境变量配置