【问题标题】:Could not get json value while fetching all data from table using Python使用 Python 从表中获取所有数据时无法获取 json 值
【发布时间】:2017-07-08 09:40:29
【问题描述】:

我需要以表格格式显示 db 表数据,但我无法使用 Python 找到 JSON 格式的数据。我在下面提供我的代码。

def view_book(request):
    """ This function is used for disply all the data """

    conn = sqlite3.connect("db.sqlite3")
    cursor = conn.cursor()
    cursor.execute("SELECT  * FROM booking_meeting ORDER BY id desc")
    all_value = cursor.fetchall()
    root = []
    json_output=json.dumps(all_value)
    print(json_output)
    for book in json_output:
        root.append(
            {'lname': book.location_name,
             'roomname': book.room_name,
             'seat': book.no_seat,
             'project': book.projector,
             'video': book.video,
             'from_date': book.from_date,
             'to_date': book.to_date})
    return render(request, 'booking/view_book.html', {'people': root})

这里出现以下错误。

Request Method: GET
Request URL:    http://127.0.0.1:8000/view_book/
Django Version: 1.11.2
Exception Type: AttributeError
Exception Value:    
'str' object has no attribute 'location_name'

这里我需要将所有数据附加到 JSON 格式中,以便能够在表格中显示。

【问题讨论】:

  • 你为什么不用orm?
  • 其实我有要求对每个数据库操作使用直接sql查询。您能否根据我的需要通过帖子分享您的想法。
  • 目前在我的手机上,一有机会就会这样做。
  • 好的,您可以分享任何参考吗?

标签: python json django


【解决方案1】:

您为什么要在 将属性转储到 JSON 之后尝试访问它们? JSON 是一个字符串,不解析就不能遍历它的属性。

如果你不打算打印它,就不要使用 JSON,在你处理它之后将你的数据渲染成 JSON:

def view_book(request):
    """ This function is used for disply all the data """

    conn = sqlite3.connect("db.sqlite3")
    conn.row_factory = sqlite3.Row  # needs this to create dictionaries
    cursor = conn.cursor()
    cursor.execute("SELECT  * FROM booking_meeting ORDER BY id desc")
    all_value = cursor.fetchall()
    root = []
    for book in all_value:
        book = dict(book)  # map it into a dict
        root.append(
            {'lname': book["location_name"],
             'roomname': book["room_name"],
             'seat': book["no_seat"],
             'project': book["projector"],
             'video': book["video"],
             'from_date': book["from_date"],
             'to_date': book["to_date"]})
    return render(request, 'booking/view_book.html', {'people': root})

当然,如果您希望 people 保存文字 JSON,请在返回之前将其转换为 JSON:

    return render(request, 'booking/view_book.html', {'people': json.dumps(root)})

【讨论】:

  • 我和你一样,但还是Exception Value: 'tuple' object has no attribute 'location_name'错误。
  • @satya - 这是因为默认情况下,您从fetchall() 获得结果的元组,而不是实际的字典。检查上面的更新(sqlite3.connect()之后的添加行)
  • 再次抛出错误Exception Value: 'sqlite3.Row' object has no attribute 'location_name'
  • 因为print(all_value) 给出这样的数据[(3, u'cottage', u'2014-12-08T15:43:00', u'2014-12-08T15:43:00', u'5', u'Yes', u'No', u'2017-07-08 09:08', u'cuttuck'), (2, u'cottage', u'2014-12-08T15:43:00', u'2014-12-08T15:43:00', u'5', u'Yes', u'No', u'2017-07-08 08:51', u'cuttuck'), (1, u'room1', u'2014-12-08T15:43:00', u'2014-12-08T15:43:00', u'3', u'Yes', u'Yes', u'2017-07-08 07:48', u'Bhubaneswar')]
  • 它抛出另一个错误Exception Value: Index must be int or string
【解决方案2】:

当您执行all_value = cursor.fetchall() 时,all_value 已经是您的记录的可迭代对象。

当您执行json_output=json.dumps(all_value) 时,您会将其全部转换为字符串。

因此,for book in json_output: 将遍历一个字符串。

您可以简单地跳过 JSON 转换:

def view_book(request):
    """ This function is used for disply all the data """

    conn = sqlite3.connect("db.sqlite3")
    cursor = conn.cursor()
    cursor.execute("SELECT  * FROM booking_meeting ORDER BY id desc")
    all_value = cursor.fetchall()
    root = []
    for book in all_value:
        root.append(
            {'lname': book.location_name,
             'roomname': book.room_name,
             'seat': book.no_seat,
             'project': book.projector,
             'video': book.video,
             'from_date': book.from_date,
             'to_date': book.to_date})
    return render(request, 'booking/view_book.html', {'people': root})

【讨论】:

  • 我按照你做了,但同样的错误Exception Value: 'tuple' object has no attribute 'location_name'
【解决方案3】:

问题是一旦你把它转换成 JSON 对象,它就会被 python 当作字符串对待。因此,在迭代时,您不会将 'book' 作为对象,而是作为字符串,这就是您收到此错误的原因。您可以尝试以下方法:

1) 迭代 all_value 而不是 json_output。

2) 遍历 json.loads(json_output)。我不确定这是否可行。

3) 编写原始 SQL 查询不是一个好习惯,而是使用 django ORM。你可能想这样做:

def view_book(request):
    """ This function is used for disply all the data """

    all_value = BookingMeeting.objects.order_by('-id')
    root = []
    for book in all_value:
        root.append(
            {'lname': book.location_name,
             'roomname': book.room_name,
             'seat': book.no_seat,
             'project': book.projector,
             'video': book.video,
             'from_date': book.from_date,
             'to_date': book.to_date})
    json_output=json.dumps(root)
    return render(request, 'booking/view_book.html', {'people': root})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2021-11-04
    • 1970-01-01
    • 2012-09-18
    • 2019-10-14
    • 2021-02-15
    相关资源
    最近更新 更多