Il semble que votre question porte sur la sérialisation de la structure des données d'une instance de modèle Django à des fins d'interopérabilité. Les autres posters sont corrects : si vous voulez 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 queryset avec un objet. Si, d'autre part, ce dont vous avez besoin est un moyen de regonfler l'instance du modèle quelque part ailleurs sans toucher à la base de données ou sans utiliser Django, alors vous avez un peu de travail à faire.
Voilà ce que je fais :
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. Mon implémentation dépend d'une de ses caractéristiques, mais il devrait y avoir des moyens similaires avec d'autres convertisseurs.
Deuxièmement, mettez en place un json_equivalent
sur tous les modèles que vous pourriez avoir besoin de sérialiser. Il s'agit d'une méthode magique pour demjson
mais c'est probablement une chose à laquelle vous devez penser, quelle que soit la mise en œuvre que vous choisissez. L'idée est de retourner un objet qui est directement convertible en json
(c'est-à-dire un tableau ou un dictionnaire). Si vous voulez vraiment faire cela automatiquement :
def json_equivalent(self):
dictionary = {}
for field in self._meta.get_all_field_names()
dictionary[field] = self.__getattribute__(field)
return dictionary
Cela ne vous sera utile que si vous disposez d'une structure de données complètement plate (aucune ForeignKeys
uniquement des chiffres et des chaînes de caractères dans la base de données, etc.) Sinon, vous devriez sérieusement réfléchir à la bonne façon d'implémenter cette méthode.
Troisièmement, appelez demjson.JSON.encode(instance)
et tu as ce que tu veux.
0 votes
Bien qu'il semble que vous puissiez sérialiser un queryset de 1 objet, vous ne pouvez pas utiliser les classes de
django.core
pour le faire. Y a-t-il une raison particulière de ne pas utiliser la sérialisation du queryset ?1 votes
Le sérialiseur queryset enveloppe le résultat dans deux couches de plus que nécessaire. Vous devez donc faire data[0].fields.name au lieu de data.name.
0 votes
C'est ce que je pensais. J'ai rencontré le même problème lorsque j'écrivais une interface GWT pour un backend django. On dirait que David pourrait être sur quelque chose.
0 votes
Duplication possible de Sérialiseur Django pour un objet