27 votes

Sérialiseur Django pour un objet

J'essaie de trouver un moyen de sérialiser un objet de modèle Django au format JSON, quelque chose comme :

j = Job.objects.get(pk=1)
##############################################
#a way to get the JSON for that j variable???
##############################################

Je ne veux pas :

from django.core import serializers
serializers.serialize('json', Job.objects.get(pk=1),ensure_ascii=False)

Parce qu'il renvoie un tableau JSON, et non une représentation d'un seul objet.

Des idées ?

Une solution à laquelle je pense : trouver un moyen d'obtenir un hash(attribut,valeur) de l'objet et ensuite utiliser simplejson pour obtenir la représentation JSON de celui-ci, mais je ne sais pas comment obtenir ce hash.

34voto

istruble Points 5686

Pourquoi ne pas simplement masser ce que vous obtenez en retour de serializers.serialize ? Il n'est pas très difficile d'enlever les crochets à l'avant et à l'arrière du résultat.

job = Job.objects.get(pk=1)
array_result = serializers.serialize('json', [job], ensure_ascii=False)
just_object_result = array_result[1:-1]

Ce n'est pas une réponse très élaborée, mais elle vous donnera l'objet en notation json.

20voto

JPG Points 11863

Méthode 1

Utiliser le sérialiseur de Django avec python format

from django.core import serializers

j = Job.objects.get(pk=1)
response = serializers.serialize('python', [j], ensure_ascii=False)

Méthode 2

utiliser json lors de la sérialisation et de la charges la chaîne de réponse

import json
from django.core import serializers

j = Job.objects.get(pk=1)
json_str_response = serializers.serialize('json', [j], ensure_ascii=False)
response = json.loads(json_str_response)[0]

Méthode-3

Utilisation Classe Serializer du framework REST de Django définir une classe de sérialiseur et sérialiser l'instance en tant que

from rest_framework import serializers

class JobSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job
        fields = '__all__'

j = Job.objects.get(pk=1)
response = JobSerializer(instance=j).data

Référence
1. Serializer Django model object

15voto

Pavel Daynyak Points 1366

Je suggère d'utiliser la fonction model_to_dict . Si je ne me trompe pas, serializers.serialize() s'appuie également sur elle, mais elle ne fonctionne que pour les list , pas une seule instance de modèle . C'est ainsi que l'on obtient un dict avec les champs de votre modèle à partir d'un seul modèle :

from django.forms.models import model_to_dict

# assuming obj is your model instance
dict_obj = model_to_dict( obj )

Vous n'avez plus besoin que d'un seul droit json.dumps appel :

import json
json.dumps(dict_obj)

2voto

tcarobruce Points 2318

Le hash que vous recherchez doit se trouver dans le fichier __dict__ attribut :

>>> import json
>>> j = Job.objects.get(pk=1)
>>> json.dumps(j.__dict__)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X