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.
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:
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:ast.literal_eval()
para analizar el campo JSON nuevamente como un diccionario al consultar el objeto. La funciónast.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:Luego puedes manipular o recuperar datos del diccionario según sea necesario.
¡Espero que esto te ayude!