【问题标题】:How to serialize sql query to json?如何将sql查询序列化为json?
【发布时间】:2014-12-31 22:50:03
【问题描述】:

我正在尝试将 sql 查询序列化为 json:

cursor.execute("""SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n
                                                    ON u.code = n.created_by
                                                JOIN zbond b
                                                    ON b.code = n.code
                                                WHERE u.userid = %s""", [user_id] )

data = serializers.serialize('json', rows, fields = ('id', 'name', 'parent'))

但它不起作用。是否可以序列化不是模型的对象,而是 sql 查询?

【问题讨论】:

  • 'tuple' 对象没有属性 '_meta'
  • 检查我的编辑,找出错误发生的原因。您必须将结果转换为 django 模型对象并将其传递给序列化程序。
  • 你发现了吗?

标签: json django django-serializer


【解决方案1】:

基于doc:

实际上,第二个参数可以是任何生成 Django 模型实例的迭代器,但它几乎总是一个 QuerySet

试试这个:

query = """SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n
                                                    ON u.code = n.created_by
                                                JOIN zbond b
                                                    ON b.code = n.code
                                                WHERE u.userid = %s"""%user_id

data = serializers.serialize('json', YourModel.objects.raw(query), fields=('id', 'name', 'parent'))

【讨论】:

【解决方案2】:

试试这个代码:

cursor = connection.cursor()
cursor.execute("""SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n ON u.code = n.created_by JOIN zbond b ON b.code = n.code WHERE u.userid = %s""", [user_id])
rows = cursor.fetchall()
result = []
keys = ('id','name','parent',)
for row in rows:
    result.append(dict(zip(keys,row)))
json_data = json.dumps(result)
return HttpResponse(json_data, content_type="application/json")

【讨论】:

    【解决方案3】:

    试试这个代码

        cursor = connection.cursor()
        cursor.execute("""SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n ON u.code = n.created_by JOIN zbond b ON b.code = n.code WHERE u.userid = %s""", [user_id])
        cursor.fetchall()
        json_data = dictfetchall(cursor)
        return HttpResponse(json_data, content_type="application/json")
    
    def dictfetchall(cursor):
        "Return all rows from a cursor as a dict"
         columns = [col[0] for col in cursor.description]
         return [
             dict(zip(columns, row))
             for row in cursor.fetchall()
         ]
    

    【讨论】:

      【解决方案4】:
      cursor = connection.cursor()
      cursor.execute("""SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n ON u.code = n.created_by JOIN zbond b ON b.code = n.code WHERE u.userid = %s""", [user_id])
      rows = cursor.fetchall()
      result = []
      keys = ('id','name','parent',)
      for row in rows:
          result.append(dict(zip(keys,row)))
      json_data = json.dumps(result)
      return HttpResponse(json_data, content_type="application/json")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2016-06-27
        • 2015-09-01
        • 2016-03-28
        • 2014-02-18
        • 2011-07-05
        • 1970-01-01
        相关资源
        最近更新 更多