使用python从表中获取所有数据时无法获取json值

时间:2017-07-08 09:40:29

标签: python json django

我正面临一个问题。我需要以表格格式显示db表数据,但是我无法使用python以JSON格式找到数据。我在下面解释我的代码。

gforth-ditc

我收到以下错误。

  

错误:

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})

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

3 个答案:

答案 0 :(得分: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)})

答案 1 :(得分:0)

执行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})

答案 2 :(得分:0)

问题是,一旦将其转换为JSON对象,它将被python视为字符串。因此,在迭代的过程中,你没有得到“预订”。作为一个对象,而不是一个字符串,这就是你得到这个错误的原因。您可以尝试以下方法:

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})