J'ai le code suivant pour sérialiser le queryset;
def render_to_response(self, context, **response_kwargs):
return HttpResponse(json.simplejson.dumps(list(self.get_queryset())),
mimetype="application/json")
Et voici ma get_querset()
[{'product': <Product: hederello ()>, u'_id': u'9802', u'_source': {u'code': u'23981', u'facilities': [{u'facility': {u'name': {u'fr': u'G\xe9n\xe9ral', u'en': u'General'}, u'value': {u'fr': [u'bar', u'r\xe9ception ouverte 24h/24', u'chambres non-fumeurs', u'chambres familiales',.........]}]
Dont j'ai besoin de sérialiser. Mais il n'est pas possible de sérialiser la <Product: hederello ()>
. Car liste composée à la fois d'objets Django et de dict. Des idées ?
simplejson
et json
ne fonctionnent pas bien avec les objets Django.
Les sérialiseurs intégrés de Django peuvent uniquement sérialiser les ensembles de requêtes remplis d'objets Django:
data = serializers.serialize('json', self.get_queryset())
return HttpResponse(data, content_type="application/json")
Dans votre cas, self.get_queryset()
contient un mélange d’objets Django et de dict.
Une option consiste à supprimer les instances de modèle dans la fonction self.get_queryset()
et à les remplacer par des dessins à l'aide de model_to_dict
:
from Django.forms.models import model_to_dict
data = self.get_queryset()
for item in data:
item['product'] = model_to_dict(item['product'])
return HttpResponse(json.simplejson.dumps(data), mimetype="application/json")
J'espère que cela pourra aider.
Le moyen le plus simple consiste à utiliser un JsonResponse .
Pour un queryset, vous devriez passer une liste du values
pour ce queryset, ainsi:
from Django.http import JsonResponse
queryset = YourModel.objects.filter(some__filter="some value").values()
return JsonResponse({"models_to_return": list(queryset)})
J'ai trouvé que cela peut être fait assez simplement en utilisant la méthode ".values", qui donne aussi des champs nommés:
result_list = list(my_queryset.values('first_named_field', 'second_named_field'))
return HttpResponse(json.dumps(result_list))
"list" doit être utilisé pour obtenir des données aussi itérables, car le type "valeur queryset" n'est qu'un dict, s'il est repris comme un itérable.
Documentation: https://docs.djangoproject.com/fr/1.7/ref/models/querysets/#values
A partir de la version 1.9 Une manière plus simple et officielle d’obtenir json
from Django.http import JsonResponse
from Django.forms.models import model_to_dict
return JsonResponse( model_to_dict(modelinstance) )
J'ai d'abord ajouté une méthode to_dict à mon modèle;
def to_dict(self):
return {"name": self.woo, "title": self.foo}
Alors j'ai ça;
class DjangoJSONEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, models.Model):
return obj.to_dict()
return JSONEncoder.default(self, obj)
dumps = curry(dumps, cls=DjangoJSONEncoder)
et utilisez enfin cette classe pour sérialiser mon queryset.
def render_to_response(self, context, **response_kwargs):
return HttpResponse(dumps(self.get_queryset()))
Ça marche plutôt bien
Notre js-programmeur m'a demandé de lui renvoyer les données exactes au format JSON au lieu d'une chaîne encodée en json.
Vous trouverez ci-dessous la solution. (La pagination n'a rien à voir avec cette question.)
objlist = Currency.objects.all()
page = request.POST.get('page', 1)
paginator = Paginator(objlist, 10)
try:
watches = paginator.page(page)
except PageNotAnInteger:
watches = paginator.page(1)
except EmptyPage:
watches = paginator.page(paginator.num_pages)
#some wired error happens if use json.dumps() directly.
JsonInfoData = serializers.serialize("json",watches);
tmp = collections.OrderedDict()
tmp['object_total'] = objlist .count()
#change the str format to json format.
tmp['data'] = json.loads(JsonInfoData)
return HttpResponse(json.dumps(tmp))