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列的主要内容,如果未能解决你的问题,请参考以下文章

带有关系的 Django 查询

如何在 django 迁移中执行原始 SQL

Django JSONField 字符串包含

如何将 pandas 数据框导出为 json 并保留原始日期时间格式?

Django 视图中的原始 SQL 查询

Django 将日期时间序列化为 QuerySet/Dict 中的 json