python - Django ORM 魔法。错误还是功能?

标签 python mysql django orm

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/

相关文章:

python - 我可以在记录时设置为 gevent greenlet 显示的自定义名称吗?

python - Django 南 : Adding a model field after a datamigration

python - 字计数器(编程导论2(python))

php - 如何导入带或不带标题的 csv 并允许记录具有空列字段?

MySQL 将一个表中的值连接到另一个表的记录中

python - 将多个生成器一起循环

java - 在 MySQL 数据库上使用 HQL 使用子查询(联接到同一个表)进行更新时出现问题。

django - Heroku:未找到 PIL==1.1.7 的匹配分布

python - 自定义 Django 字段不从查询返回 Enum 实例

django - 如何通过 django 中的链接或按钮更改状态