¿Es posible analizar json antes de aplicar la API de base de datos de Django?

Tengo una base de datos Django, en la que tengo algo de JSON almacenado. Deseo extraer este JSON, analizarlo y luego aplicarle filtros/consultas. Más específicamente, quiero tener una página web dinámica que muestre el JSON ordenado, filtrado o agrupado según las preferencias de los usuarios.

Al leer la documentación de Django, solo puedo ver cómo usar filtros prefabricados como begin_with, pero no cómo preprocesar los datos. Vi la opción para aplicar una expresión regular, pero no creo que pueda implementar un analizador JSON completo a mano. Actualmente analizo el JSON y luego lo busco usando clases de python, pero eso parece anular el propósito de usar una base de datos, particularmente porque está limitada en los tipos de consulta que puede manejar.

El JSON proviene de alguna otra fuente y no tiene garantías sobre sus campos o estructura.

Gracias por adelantado,

jhoyla

preguntado el 04 de julio de 12 a las 10:07

Supongo que el JSON almacenado/recuperado como cadena en la base de datos. Por lo tanto, no hay una base de datos como consulta en él. Puede aplicar cualquier operación de cadena admitida en python. -

Es posible que desee realizar el filtrado y la clasificación del lado del cliente (es decir, dentro de la página web mediante javascript). Esto reduce su carga y solo necesita colocar el json en la página web. -

Gracias, me preguntaba si eso sería más eficiente, pero dado que la base de datos actual es un caché local de todos modos, pensé que no. ¿Crees que intentar crear tablas a partir del JSON sobre la marcha tal como llega funcionaría? -

1 Respuestas

La mejor respuesta que he podido encontrar es agregar el JSON a la base de datos como tablas sobre la marcha para obtener dos cadenas de resultados (lo hago de esta manera porque no se garantiza que los diccionarios mantengan el orden).

TABLECONFIG = 'data_result' 
def jsontodb(conn, jsonarray):
    inits = reduce(lambda x, y: x.union(y.keys()), jsonarray, set())

conn.execute("CREATE TABLE " + TABLECONFIG + " (" + 
str(map(lambda x: x.encode('UTF-8'), inits)).encode('UTF-8').strip('[]')  + ");")
for i in jsonarray:
        d = map(lambda y: str(map(lambda x: x.encode('UTF-8'), y)).strip('[]'), zip(*i.items()))    
        conn.execute("INSERT INTO " + TABLECONFIG + " (" + d[0] + ") VALUES (" + d[1] + ");")
conn.commit()

DBCONFIG = '/work/django.sqlite3'
def pullquery(query):
    p  = loads(oqr.main(
        [str(x) for x in shlex.split(query.encode('UTF-8'))]
    ))
    conn = sqlite3.connect(DBCONFIG)
    jsontodb(conn, p)
    return conn

Dando el resultado que quiero, sin embargo, esto solo funciona si el JSON tiene como máximo 1 capa de profundidad (aunque imagino que esto podría solucionarse, ya es bastante complicado).

Respondido 04 Jul 12, 21:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.