Django中的原始sql到json,带有日期时间和十进制MySql列
Posted
技术标签:
【中文标题】Django中的原始sql到json,带有日期时间和十进制MySql列【英文标题】:Raw sql to json in Django, with Datetime and Decimal MySql columns 【发布时间】:2016-12-16 03:58:09 【问题描述】:我正在使用 Ajax 从客户端向服务器发出一些请求,我正在使用 DJango,并且我之前使用过一些 Raw Sql 查询,但是我的所有字段都是 Int、varchar 和一个 Decimal,对于最后一个我有一个最后的问题,但我覆盖了 Json 的“默认”属性,一切正常。
但那是以前,现在我有一个查询,它给了我 Decimal 和 DateTime 字段,它们都给了我编码错误,覆盖的“默认”现在不起作用,这就是为什么我使用这个新的 @987654321 @,但现在我有另一个问题,它不是编码问题,我正在使用 Django 文档上推荐的 dictfetchall(cursor)
方法,从 Sql 查询返回字典,因为cursor.fetchall()
给了我这个错误:'tuple' object has no attribute '_meta'
.
在我刚刚将该字典发送到 json.dumps(response_data,default=default)
之前一切都很好,但现在对于编码我必须使用以下内容:json.dumps(response_data,cls=DjangoJSONEncoder)
如果我以这种方式发送字典,我会收到此错误:
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
如果我尝试使用序列化程序,像这样:
response_data2= serializers.serialize('json', list(response_data))
然后将response_data2
发送到dumps
,我收到此错误:
'dict' object has no attribute '_meta'
这是mysql查询的代码:
def consulta_sql_personalizada(nombres,apellidos,puesto):
from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute("""select E.idEmpleado as id,CONCAT(Per.nombres_persona,' ',Per.apellidos_persona) as nombre,P.nombre_puesto as puesto,E.motivo_baja_empleado as motivo_baja,E.fecha_contratacion_empleado AS fecha_contratacion,E.fecha_baja_empleado as fecha_baja, SUM(V.total_venta) AS ventas_mes,E.fotografia_empleado as ruta_fotografia from Empleado as E
inner join Puesto as P on E.Puesto_idPuesto=P.idPuesto
inner join Venta as V on V.vendedor_venta=E.idEmpleado
inner join Persona as Per on E.Persona_idPersona=Per.idPersona
where (Per.nombres_persona like %s OR Per.apellidos_persona like %s OR E.Puesto_idPuesto=%s)
AND E.estado_empleado=1 AND V.estado_venta=1
AND
(YEAR(V.fecha_venta) = YEAR(Now())
AND MONTH(V.fecha_venta) = MONTH(Now()))""",[nombres,apellidos,puesto])
row = dictfetchall(cursor)
return row
这是视图的最后一部分,它使用 json 进行查询并将其发送到 ajax:
response_data=consulta_sql_personalizada(rec_nombres,rec_apellidos,rec_puesto)
return HttpResponse(
json.dumps(response_data,cls=DjangoJSONEncoder),
content_type="application/json"
)
else:
return HttpResponse(
json.dumps("nothing to see": "this isn't happening"),
content_type="application/json"
)
我想知道的是,如何使用该编码将原始 sql 结果解析为 Json?
【问题讨论】:
【参考方案1】:对不起,是我的错,我使用的是 JQuery ajax 方法,在“成功”部分我忘记停止使用json.parse
在控制台中打印数据,数据已经是 json,这就是我有那line 1 column 1 error
。我的代码的工作方式与此处发布的完全一样。如果有人想知道如何发出异步请求,我遵循了这个教程:Django form submissions using ajax
【讨论】:
以上是关于Django中的原始sql到json,带有日期时间和十进制MySql列的主要内容,如果未能解决你的问题,请参考以下文章