offer - queryset to json django
JSON Serialización de modelos Django con simplejson (3)
Me gustaría extender el simplejson . Básicamente, desea conectar la serialización de django cuando el codificador JSON encuentra un QuerySet. Podría usar algo como:
from json import dumps, loads, JSONEncoder
from django.core.serializers import serialize
from django.db.models.query import QuerySet
from django.utils.functional import curry
class DjangoJSONEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, QuerySet):
# `default` must return a python serializable
# structure, the easiest way is to load the JSON
# string produced by `serialize` and return it
return loads(serialize(''json'', obj))
return JSONEncoder.default(self,obj)
# partial function, we can now use dumps(my_dict) instead
# of dumps(my_dict, cls=DjangoJSONEncoder)
dumps = curry(dumps, cls=DjangoJSONEncoder)
Para obtener más información sobre default
método default
, eche un vistazo a la documentación de simplejson . Ponlo en un módulo de python, luego importa dumps
y listo. Pero tenga en cuenta que esta función solo le ayudará a serializar instancias de QuerySet
, no instancias de Model
directamente.
Me gustaría usar simplejson para serializar un modelo de Django. El serializador de Django no admite diccionarios ... y simplejson no es compatible con Django Querysets. Esto es todo un acertijo.
En el modelo hay patrocinadores que tienen un nivel de clave extranjera para patrocinar, estoy intentando agrupar a todos los patrocinadores que pertenecen a un cierto nivel de patrocinador. Aquí está el código que genera la lista:
from django.shortcuts import get_list_or_404
from special_event.models import Sponsor, SponsorLevel
sponsor_dict = {}
roadie_sponsors = get_list_or_404(Sponsor, level__category = SponsorLevel.ROADIE_CHOICE)
for item in roadie_sponsors:
try:
sponsor_dict[item.level.name].append(item)
except KeyError:
sponsor_dict[item.level.name] = [item]
sponsor_dict
es lo que sponsor_dict
ve una vez que está "hecho"
{
''Fan'': [<Sponsor: Fan Sponsor>],
''VIP'': [<Sponsor: VIP Sponsor>],
''Groupie'': [<Sponsor: Groupie Sponsor>],
''Silver'': [<Sponsor: Silver Sponsor>],
''Bronze'': [<Sponsor: Another Bronze Sponsor>, <Sponsor: Bronze Sponsor>]
}
Solo agregué un patrocinador en cada nivel, excepto el bronce, solo para mostrar cómo funciona. Todo lo que quiero hacer es ponerlo "todo" en JSON para que jQuery pueda interpretarlo fácilmente. ¿Pueden los otros serializadores de Django (como XML o YAML) lograr esto? ¿Puedo "extender" el Serializador JSON de Django para manejar diccionarios o "extender" simplejson para manejar objetos Django QuerySet?
Una forma realmente flexible de serializar la mayoría de las estructuras en django es usar la clase de serializador que se encuentra here
basado en la respuesta de Clement, hice esto para incorporar modelos a JSON también.
def toJSON(obj):
if isinstance(obj, QuerySet):
return simplejson.dumps(obj, cls=DjangoJSONEncoder)
if isinstance(obj, models.Model):
#do the same as above by making it a queryset first
set_obj = [obj]
set_str = simplejson.dumps(simplejson.loads(serialize(''json'', set_obj)))
#eliminate brackets in the beginning and the end
str_obj = set_str[1:len(set_str)-2]
return str_obj