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
?如果某物是数字的,则将其存储在数字类型对象中。使用CharField
s 进行建模是很糟糕的。
你是对的,但我现在不能改变它,因为我可能会破坏很多工作功能。
【参考方案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 使用转换变量进行注释的主要内容,如果未能解决你的问题,请参考以下文章