【问题标题】:Converting result of MySQL query in Django to JSON将 Django 中 MySQL 查询的结果转换为 JSON
【发布时间】:2013-07-18 09:30:51
【问题描述】:

所以我使用这样的 mySQL 查询来查询我的数据库:

    cursor = connection.cursor()
    cursor.execute("select winner,count(winner) as count from DB")
    data = cursor.fetchall()

现在我想以 JSON 格式将数据表发送到我的应用程序(作为 GET 请求)。这样做不会发送格式正确的 JSON 响应,我无法在客户端解析它。

    return HttpResponse(json.dumps(data), content_type='application/json;charset=utf8')

json.dumps(data) 返回:

    [["John Doe", 45]]

在这方面的任何帮助将不胜感激。

【问题讨论】:

    标签: django json


    【解决方案1】:

    JSON 格式正确,但您正在转储一个列表,您应该转储一个字典...类似于:

    myData = {'people': data}
    
    json.dumps(myData)
    

    重点是:有效的 json 响应必须以花括号开头和结尾,因此为了提供有效的 json,您必须将 Python 字典对象转储为“根对象”...换句话说,您需要至少是一个带有键的对象。

    来自http://json.org

    JSON 建立在两种结构之上:

    A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed
    

    列表或关联数组。 值的有序列表。在大多数语言中,这被实现为数组、向量、列表或序列。

    【讨论】:

    • 确实有效!但是有什么方法可以直接使用它们所属的字段的名称吗?这似乎有点多余。对于每个键值对,我都必须输入键的名称?
    【解决方案2】:
    from django.core import serializers
    
    json_data = serializers.serialize('json', data)
    return HttpResponse(json_data, mimetype='application/json')
    

    然而并不是所有东西都可以像这样序列化成 JSON,有些东西需要自定义 encoder

    您应该使用模型和 ORM,而不是编写自己的 SQL。 您可以轻松地将您的语句转换为这个简单的模型和简洁的 ORM 调用。

    class Winner(models.Model):
       name = models.CharField()
    

    您的数据库调用现在将是 Winner.objects.all(),这将给所有获胜者

    和计数

    Winner.objects.annotate(wins=Count('name'))
    

    【讨论】:

    • 我试过这个。但是我收到了这个错误:AttributeError: 'tuple' object has no attribute '_meta' 但是我会仔细阅读 Django 文档,谢谢。
    • 没错,你得到一个元组,serialize 方法可能会给你带来麻烦。 IMO,您最终想要做的是从编写自己的 SQL 转变为 Django ORM,因为您需要与 SQL 结果集相关的字段。你所追求的是一个看起来像这样{'name': 'John Doe', 'wins':45}的json。
    • 啊,出于某种原因,我避开了 Django ORM。但我认为在这种情况下最有意义。谢谢,我要试试这个!
    【解决方案3】:
    from django.http import JsonResponse
    from django.db import connections
    from django.http import HttpResponse
    import json
    
    def testRawQuery(request):
        cursor = connections['default'].cursor()
        cursor.execute("select winner,count(winner) as count from DB")
        objs = cursor.fetchall() 
        json_data = []
        for obj in objs:
            json_data.append({"winner" : obj[0], "count" : obj[1]})
        return JsonResponse(json_data, safe=False)
    

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 2017-10-15
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多