data = self.get_queryset()\
.annotate(total=Func(Sum('money_field'), Value('CHAR'), function="CONVERT"))\
.filter(date__lt=end, date__gte=start)
如果我执行data.query
- 它工作正常,但是data.all()
引发MySQL错误。
这个魔法的原因是 Django Func(),当我尝试传递常量参数(不带括号)时——有一种方法可以做到这一点:使用 django Value()。
当我通过 data.query 获取查询时,它工作正常,但是当执行时 - mysql 添加额外的引号,
工作警告是:
data = self.get_queryset()\
.annotate(total=Func(Sum('money_field'), Value('CHAR'), function="CONVERT"))\
.filter(date__lt=end, date__gte=start)
cursor = connection.cursor()
cursor.execute(str(data.query).replace('%', '%%'), [])
data_list = cursor.fetchall()
有人会说 WTF 吗?
最佳答案
更新2: 查询集的打印查询如下所示:
SELECT `blankapp_modela`.`id`, `blankapp_modela`.`decimal_field`,
CONVERT(SUM(`blankapp_modela`.`decimal_field`), CHAR) AS `total` FROM
`blankapp_modela` GROUP BY `blankapp_modela`.`id` ORDER BY NULL
深入研究 mysql 游标,我发现了下一个:
SELECT `blankapp_modela`.`id`, `blankapp_modela`.`decimal_field`,
CONVERT(SUM(`blankapp_modela`.`decimal_field`), 'CHAR') AS `total` FROM
`blankapp_modela` GROUP BY `blankapp_modela`.`id` ORDER BY NULL LIMIT 21
CHAR
被包裹到引号中,所以这是不正确的。
目前不知道正确的解决方案。
这不是 django 问题,而是 MySQLdb 行为。
关于python - Django ORM 魔法。错误还是功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31287184/