Il y a beaucoup de documentation sur la façon de sérialiser un modèle QuerySet, mais comment sérialiser simplement en JSON les champs d'une instance de modèle?
python
django
json
django-models
serialization
Jason Christa
la source
la source
django.core
pour ce faire. Une raison particulière de ne pas utiliser la sérialisation du jeu de requêtes?Réponses:
Vous pouvez facilement utiliser une liste pour envelopper l'objet requis et c'est tout ce dont les sérialiseurs django ont besoin pour le sérialiser correctement, par exemple:
la source
[0]
à la fin de votre dernière ligne, comme @DavorLucic l'a suggéré? Et pas besoin de virgule de fin dans votre liste littérale (pour l'amour de PEP8;).Si vous avez affaire à une liste d'instances de modèle, le mieux que vous puissiez faire est d'utiliser
serializers.serialize()
, cela répondra parfaitement à vos besoins.Cependant, vous devez faire face à un problème en essayant de sérialiser un seul objet, pas un
list
objet. De cette façon, afin de se débarrasser des différents hacks, il suffit d'utiliser Djangomodel_to_dict
(si je ne me trompe pas,serializers.serialize()
cela dépend aussi):Vous avez maintenant juste besoin d'un
json.dumps
appel direct pour le sérialiser vers json:C'est tout! :)
la source
datetime
champs. Résolu de cette façonjson.loads(serialize('json', [obj]))[0]
pendant que le sérialiseur estdjango.core.serializers.serialize
Pour éviter le wrapper de tableau, supprimez-le avant de renvoyer la réponse:
J'ai aussi trouvé cet article intéressant sur le sujet:
http://timsaylor.com/convert-django-model-instances-to-dictionaries
Il utilise django.forms.models.model_to_dict, qui ressemble à l'outil parfait pour le travail.
la source
Il y a une bonne réponse à cela et je suis surpris qu'elle n'ait pas été mentionnée. En quelques lignes, vous pouvez gérer les dates, les modèles et tout le reste.
Créez un encodeur personnalisé capable de gérer les modèles:
Maintenant, utilisez-le lorsque vous utilisez json.dumps
Désormais, les modèles, les dates et tout peuvent être sérialisés et il n'est pas nécessaire que ce soit dans un tableau ou sérialisé et non sérialisé. Tout ce que vous avez personnalisé peut simplement être ajouté à la
default
méthode.Vous pouvez même utiliser le JsonResponse natif de Django de cette façon:
la source
json.dumps
etjson.dump
. De cette façon, vous n'avez pas besoin de modifier le flux de travail de l'application car vous utilisez des objets personnalisés ou ajoutez un autre appel de méthode avant la conversion en json. Ajoutez simplement votre code de conversion dans l'encodeur et vous êtes prêt à partir.Il semble que ce que vous demandez implique de sérialiser la structure de données d'une instance de modèle Django pour l'interopérabilité. Les autres affiches sont correctes: si vous vouliez que le formulaire sérialisé soit utilisé avec une application python qui peut interroger la base de données via l'API de Django, alors vous voudriez sérialiser un jeu de requêtes avec un objet. Si, d'un autre côté, vous avez besoin d'un moyen de regonfler l'instance de modèle ailleurs sans toucher à la base de données ou sans utiliser Django, alors vous avez un peu de travail à faire.
Voici ce que je fais:
Tout d'abord, j'utilise
demjson
pour la conversion. C'est ce que j'ai trouvé en premier, mais ce n'est peut-être pas le meilleur. Ma mise en œuvre dépend de l'une de ses fonctionnalités, mais il devrait y avoir des moyens similaires avec d'autres convertisseurs.Deuxièmement, implémentez une
json_equivalent
méthode sur tous les modèles dont vous pourriez avoir besoin en série. C'est une méthode magique pourdemjson
, mais c'est probablement quelque chose à quoi vous voudrez réfléchir, quelle que soit l'implémentation que vous choisissez. L'idée est de renvoyer un objet directement convertible enjson
(c'est- à -dire un tableau ou un dictionnaire). Si vous voulez vraiment faire cela automatiquement:Cela ne vous sera utile que si vous avez une structure de données complètement plate (non
ForeignKeys
, uniquement des nombres et des chaînes dans la base de données, etc.). Sinon, vous devriez sérieusement réfléchir à la bonne façon de mettre en œuvre cette méthode.Troisièmement, appelez
demjson.JSON.encode(instance)
et vous avez ce que vous voulez.la source
Si vous demandez comment sérialiser un seul objet à partir d'un modèle et que vous savez que vous n'obtiendrez qu'un seul objet dans le jeu de requêtes (par exemple, en utilisant objects.get), utilisez quelque chose comme:
ce qui vous donnerait quelque chose de la forme:
la source
J'ai résolu ce problème en ajoutant une méthode de sérialisation à mon modèle:
Voici l'équivalent détaillé de ceux qui sont opposés aux one-liners:
_meta.fields
est une liste ordonnée de champs de modèle accessibles depuis les instances et depuis le modèle lui-même.la source
Voici ma solution pour cela, qui vous permet de personnaliser facilement le JSON ainsi que d'organiser les enregistrements associés
Tout d'abord, implémentez une méthode sur le modèle. J'appelle
json
mais vous pouvez l'appeler comme vous voulez, par exemple:Ensuite, dans la vue que je fais:
la source
car.json()
Utilisez la liste, cela résoudra le problème
Étape 1:
Étape 2:
Étape 3:
la source
Pour sérialiser et désérialiser, utilisez ce qui suit:
la source
.values()
est ce dont j'avais besoin pour convertir une instance de modèle en JSON.Documentation .values (): https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values
Exemple d'utilisation avec un modèle appelé Project .
Remarque: j'utilise Django Rest Framework
Résultat d'un identifiant valide:
la source
Si vous souhaitez renvoyer l' objet de modèle unique en tant que réponse json à un client, vous pouvez effectuer cette solution simple:
la source
Utilisez Django Serializer avec
python
format,Quelle est la différence entre
json
etpython
format?Le
json
format renverra le résultat commestr
alors quepython
retournera le résultat dans l'unlist
ou l' autreOrderedDict
la source
OrderedDict
, pasdict
Il ne semble pas que vous puissiez sérialiser une instance, vous devrez sérialiser un QuerySet d'un objet.
Je suis à court de la
svn
version de django, donc cela peut ne pas être dans les versions antérieures.la source
Je renvoie le dict de mon instance
donc il renvoie quelque chose comme {'champ1': valeur, "champ2": valeur, ....}
la source
TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
que diriez-vous de cette façon:
ou excluez tout ce que vous ne voulez pas.
la source
Toutes ces réponses étaient un peu hacky par rapport à ce que j'attendrais d'un framework, la méthode la plus simple, je pense de loin, si vous utilisez le framework rest:
Cela utilise directement le sérialiseur, en respectant les champs que vous avez définis dessus, ainsi que les associations, etc.
la source