我有一个这样的MySQL视图:
VIEW `qty_sold_view` AS
SELECT
`t2`.`upc` AS `upc`, SUM(`t2`.`qty`) AS `qty_sold`
FROM
(`inventory_orders` `t1`
JOIN `inventory_sales` `t2` ON ((`t2`.`order_id` = `t1`.`id`)))
WHERE
(`t1`.`date_placed` > (CURDATE() - INTERVAL 42 DAY))
GROUP BY `t2`.`upc`
然后我使用Django原始查询为此视图运行查询:
sql = 'SELECT `upc`, `qty_sold` FROM `qty_sold_view` WHERE `upc` = 1001 OR `upc`= 1002 ...'
with connection.cursor() as con:
con.execute(sql)
请注意,对于inventory_orders
表和inventory_sales
表,我都有Django模型,但视图本身没有。
此查询的结果如下:
((1001, Decimal('1')), (1002, Decimal('4')), ...)
qty
的{{1}}列和upc
列均为INT类型,因此我不理解为什么数据以inventory_sales
的形式返回。
问题是,当我尝试Decimal
查询结果时,会得到以下信息:
TypeError:Decimal类型的对象不可JSON序列化
我可以使用网上找到的各种答案来解决此问题,这些答案实际上是对小数点进行json序列化,但是当它们不应该放在首位时,这样做似乎很愚蠢。
如何强制MySQL将它们视为INT?
答案 0 :(得分:0)
根据this,在使用FORMAT
函数时,总是应该使用SUM
。
将视图更改为:
VIEW `qty_sold_view` AS
SELECT
`t2`.`upc` AS `upc`, FORMAT(SUM(`t2`.`qty`), 0) AS `qty_sold`
FROM
(`inventory_orders` `t1`
JOIN `inventory_sales` `t2` ON ((`t2`.`order_id` = `t1`.`id`)))
WHERE
(`t1`.`date_placed` > (CURDATE() - INTERVAL 42 DAY))
GROUP BY `t2`.`upc`
为我修复了。