type queryset offer not django json serialization django-queryset

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