La sortie de Django queryset JSON
Je veux sérialiser mon queryset, et je le veux dans un format que ce point de vue sorties:
class JSONListView(ListView):
queryset = Users.objects.all()
def get(self, request, *args, **kwargs):
return HttpResponse(json.dumps({'data': [['bar','foo','bar','foo'],['foo','bar','foo','bar']]}, indent=4), content_type='application/json')
Simplement, je ne sais pas comment la sortie de la queryset au lieu de l'manuelle des données dans l'exemple.
J'ai essayé
json.dumps({"data": self.get_queryset()})
et
serializers.serialize("json", {'data': self.get_queryset()})
mais il l'habitude de travailler. Ce que je fais mal? Je dois faire un JSON personnalisé Codeur?
- Ce qui n'a pas de travail? Avez-vous lu les docs sur serialising querysets? J'imagine que le problème est avec ForeignKey/M2M relations au sein de votre modèle
InformationsquelleAutor user2232982 | 2013-04-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser JsonResponse avec les valeurs. Exemple Simple:
Ou une autre approche avec Django est construit en sérialiseurs:
Dans ce cas, la réponse sera peu différente (sans tiret par défaut):
Je dois dire que c'est une bonne pratique que d'utiliser quelque chose comme guimauve pour sérialiser queryset.
...et quelques notes pour de meilleures performances:
objects.values()
pour spécifier la liste des champs requis pour éviter la sérialisation et l'envoi au client inutiles modèle de champs (vous pouvez également transmettre desfields
àserializers.serialize
);JsonResponse
avec JSON est incorrecte,HttpResponse
devrait être utilisé à la place. Si vous utilisez{model: "name.sub", pk: 1, fields: {,…}}
. J'aime simple JSON avec ses propres champs.Il n'a pas de travail, parce que QuerySets ne sont pas JSON serializable.
1) En cas de
json.dumps
vous devez explicitement convertir votre QuerySet JSON des objets sérialisables:Et la sérialisation:
2) En cas de sérialiseurs. Sérialiseurs accepter JSON serializable objet ou d'un QuerySet, mais un dictionnaire contenant un QuerySet est ni. Essayez ceci:
Lire plus à ce sujet ici:
https://docs.djangoproject.com/en/dev/topics/serialization/
Pour une solution efficace, vous pouvez utiliser .les valeurs de() fonction pour obtenir une liste des dict des objets et de les vider de réponse json en utilisant c'est à dire JsonResponse (n'oubliez pas de régler
safe=False
).Une fois que vous avez votre choix queryset objet, de le transformer en réponse JSON comme ceci:
Vous pouvez spécifier des noms de champ dans
.values()
la fonction de retour, ne voulait champs (l'exemple ci-dessus sera de retour tous les champs de modèle à objets json).Si l'objectif est de construire une API vous permettant d'accéder à vos modèles au format JSON, je vous recommande d'utiliser le
django-restframework
qui est extrêmement populaire colis dans le Django de la communauté pour réaliser ce type de tâches.Il inclut des fonctionnalités utiles telles que la Pagination, la Définition de Sérialiseurs, modèles Imbriqués/relations et plus. Même si vous ne voulez faire mineur Javascript, des tâches et des appels Ajax je voudrais encore vous proposons de vous construire une bonne API à l'aide de l'Django Reste du Cadre au lieu de définir manuellement la réponse JSON.
Essayez ceci: