Hay mucha documentación sobre cómo serializar un Model QuerySet, pero ¿cómo se serializa a JSON los campos de una instancia de modelo?
python
django
json
django-models
serialization
Jason Christa
fuente
fuente
django.core
para hacer esto. ¿Alguna razón en particular para no usar serializar el conjunto de consultas?Respuestas:
Puede usar fácilmente una lista para ajustar el objeto requerido y eso es todo lo que los serializadores de django necesitan para serializarlo correctamente, por ejemplo:
fuente
[0]
al final de tu última línea, como sugirió @DavorLucic? Y no hay necesidad de una coma final en su lista literal (por amor a PEP8;).Si se trata de una lista de instancias de modelo, lo mejor que puede hacer es usarla
serializers.serialize()
, se ajustará perfectamente a su necesidad.Sin embargo, debe enfrentar un problema al intentar serializar un solo objeto, no uno
list
de los objetos. De esa manera, para deshacerte de diferentes hacks, solo usa Djangomodel_to_dict
(si no me equivoco,serializers.serialize()
confía en él también):Ahora solo necesita una
json.dumps
llamada directa para serializarlo a json:¡Eso es! :)
fuente
datetime
campos. Lo resolvió de esta manerajson.loads(serialize('json', [obj]))[0]
mientras el serializador esdjango.core.serializers.serialize
Para evitar el contenedor de matriz, elimínelo antes de devolver la respuesta:
También encontré esta publicación interesante sobre el tema:
http://timsaylor.com/convert-django-model-instances-to-dictionaries
Utiliza django.forms.models.model_to_dict, que parece la herramienta perfecta para el trabajo.
fuente
Hay una buena respuesta para esto y me sorprende que no se haya mencionado. Con unas pocas líneas puedes manejar fechas, modelos y todo lo demás.
Cree un codificador personalizado que pueda manejar modelos:
Ahora úselo cuando use json.dumps
Ahora los modelos, las fechas y todo se pueden serializar y no tiene que estar en una matriz o serializado y sin serializar. Todo lo que tenga personalizado puede agregarse al
default
método.Incluso puede usar la respuesta Json nativa de Django de esta manera:
fuente
json.dumps
yjson.dump
métodos. De esta manera, no necesita cambiar el flujo de trabajo de la aplicación porque usa objetos personalizados o agrega otro método de llamada antes de convertir a json. Simplemente agregue su código de conversión en el codificador y estará listo para comenzar.Parece que lo que está preguntando implica la serialización de la estructura de datos de una instancia del modelo Django para la interoperabilidad. Los otros carteles son correctos: si desea que el formulario serializado se use con una aplicación de Python que puede consultar la base de datos a través de la API de Django, entonces desea serializar un conjunto de consultas con un objeto. Si, por otro lado, lo que necesita es una forma de volver a inflar la instancia del modelo en otro lugar sin tocar la base de datos o sin usar Django, entonces tiene un poco de trabajo por hacer.
Esto es lo que hago:
Primero, uso
demjson
para la conversión. Resultó ser lo que encontré primero, pero podría no ser el mejor. Mi implementación depende de una de sus características, pero debería haber formas similares con otros convertidores.Segundo, implemente un
json_equivalent
método en todos los modelos que pueda necesitar serializados. Este es un método mágicodemjson
, pero probablemente sea algo en lo que quieras pensar, sin importar la implementación que elijas. La idea es que devuelva un objeto que sea directamente convertible ajson
(es decir, una matriz o diccionario). Si realmente quieres hacer esto automáticamente:Esto no será útil para usted a menos que tenga una estructura de datos completamente plana (no
ForeignKeys
, solo números y cadenas en la base de datos, etc.). De lo contrario, debe pensar seriamente en la forma correcta de implementar este método.Tercero, llama
demjson.JSON.encode(instance)
y tienes lo que quieres.fuente
Si está preguntando cómo serializar un solo objeto de un modelo y sabe que solo obtendrá un objeto en el conjunto de consultas (por ejemplo, usando objects.get), use algo como:
que te daría algo de la forma:
fuente
Resolví este problema agregando un método de serialización a mi modelo:
Aquí está el equivalente detallado para aquellos aversos a las frases sencillas:
_meta.fields
es una lista ordenada de campos de modelo a la que se puede acceder desde instancias y desde el modelo mismo.fuente
Aquí está mi solución para esto, que le permite personalizar fácilmente el JSON y organizar registros relacionados
Primero implemente un método en el modelo. Llamo
json
pero puedes llamarlo como quieras, por ejemplo:Entonces en la vista que hago:
fuente
car.json()
Use la lista, resolverá el problema
Paso 1:
Paso 2:
Paso 3:
fuente
Para serializar y deserializar, use lo siguiente:
fuente
.values()
es lo que necesitaba para convertir una instancia de modelo a JSON..values () documentación: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values
Ejemplo de uso con un modelo llamado Proyecto .
Nota: estoy usando Django Rest Framework
Resultado de una identificación válida:
fuente
Si desea devolver el objeto de modelo único como respuesta json a un cliente, puede hacer esta solución simple:
fuente
Utilice Django Serializer con
python
formato,¿Cuál es la diferencia entre
json
ypython
formato?El
json
formato devolverá el resultado comostr
mientraspython
que devolverá el resultado enlist
oOrderedDict
fuente
OrderedDict
, nodict
No parece que pueda serializar una instancia, tendría que serializar un QuerySet de un objeto.
Me quedé sin el
svn
lanzamiento de django, por lo que puede que no sea en versiones anteriores.fuente
Devuelvo el dict de mi instancia
entonces devuelve algo como {'field1': value, "field2": value, ....}
fuente
TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
¿qué tal esta manera:
o excluir cualquier cosa que no quieras.
fuente
Todas estas respuestas fueron un poco extravagantes en comparación con lo que esperaría de un marco, el método más simple, creo que con mucho, si está utilizando el resto del marco:
Esto utiliza el serializador directamente, respetando los campos que ha definido en él, así como cualquier asociación, etc.
fuente