es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se pueden obtener registros utilizando Django ORM.

Problema:

Intentando obtener un registro usando Django ORM, de una tabla que contiene un campo JSON, estoy usando la siguiente línea:

test_object = House.objects.get(id=301)

Error:

TypeError: el objeto JSON debe ser str, bytes o bytearray, no dict

Posible problema:

Noté que un desarrollador anterior actualizó el formato del campo JSON en la tabla, parece que el JSON tenía un formato incorrecto. El script usado para formatear la columna JSON es el siguiente:

 for i in data:
 jsonstring = json.dumps(i.result)
 new_clear = jsonstring.replace("\\", "")
 new_clear = jsonstring.replace("NaN", "null")
 i.result = json.loads(new_clear)
 i.save()

Comentarios:

En pgAdmin, el campo JSON se ve bien y está formateado correctamente, vea una copia parcial del JSON a continuación:

{"owner_id": 45897, "first_name": "John", "last_name": "DNC", "estate_id": 3201, "sale_date": "3/18/19", "property_street": "123 main st", "property_city": "Miami", "property_state": "FL", "property_zipcode": 33125, "Input_First_Name": "John", "Input_Last_Name": "DNC"}

Me gustaría saber cómo manejar este campo JSON para consultar el objeto. Cualquier ayuda será apreciada. Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El mensaje de error indica que el campo JSON es un diccionario en lugar de ser una cadena, byte o bytearray.

    Para abordar este problema, puedes intentar lo siguiente:

    1. Modificar el campo JSON para que sea una cadena. Pero esto puede requerir algunos cambios en el esquema de tu base de datos, lo cual puede no ser factible en tu proyecto.
    2. Usar el método json.dumps() para convertir el campo JSON en una cadena dentro del script. Parece que el script que proporcionaste intenta dar formato al campo JSON, pero sin asignar el resultado convertido nuevamente al campo. Por lo tanto, debes modificar tu script de la siguiente manera:

    for i in data:
        jsonstring = json.dumps(i.result)
        new_clear = jsonstring.replace("\\", "")
        new_clear = new_clear.replace("NaN", "null")
        i.result = new_clear  # Asignar la cadena JSON formateada nuevamente al campo.
        i.save()
    
    1. Usar la función ast.literal_eval() para analizar el campo JSON nuevamente como un diccionario al consultar el objeto. La función ast.literal_eval() puede evaluar de manera segura una cadena que contiene una expresión de Python que consiste en varios tipos, incluido el diccionario. Así es como puedes usarla para convertir el campo JSON nuevamente a un diccionario:
    import ast
    
    test_object = House.objects.get(id=301)
    json_dict = ast.literal_eval(test_object.result)
    

    Luego puedes manipular o recuperar datos del diccionario según sea necesario.

    ¡Espero que esto te ayude!

Comments are closed.