Django ORM魔术。错误或功能?

时间:2015-07-08 08:22:50

标签: 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?

1 个答案:

答案 0 :(得分:0)

UPD 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的行为。