2010-06-16 4 views
4

Je travaille sur un service web basé sur Django et j'essaie de trouver la meilleure façon de faire ma sérialisation.Django: options de sérialisation personnalisées?

L'exigence difficile, cependant, est que je voudrais avoir un contrôle total sur le format et les champs contenus dans la réponse. Par exemple, les sérialiseurs Django (qui, malheureusement, inclut le wadofstuff serializer) enveloppent automatiquement les champs dans { model: "app.Model", pk: 42, fields: { ... }}, ce qui est génial pour créer des appareils, mais ce n'est pas génial pour moi - je voudrais un contrôle total sur la sortie .

En outre, je voudrais un sérialiseur qui est au courant des objets de Django ainsi, par exemple, il fera la bonne chose avec un QuerySet ou ManyToManyField.

Actuellement, je pense à utiliser emitters.py de django-piston, mais mon expérience avec django-piston n'a été que médiocre, donc j'aimerais voir s'il y a d'autres options.

Alors, y a-t-il d'autres options pour les sérialiseurs Django personnalisables? ª: Il est peu documenté et testé, et j'ai eu quelques problèmes avec le sérialiseur.

+0

Oh, oui: format. Je vais encoder le résultat AMF et l'envoyer à un client Flash, donc le sérialiseur devrait produire une structure de données composée uniquement de types primitifs (dicts, nombres, chaînes de caractères, etc.). –

Répondre

1

Avez-vous regardé django-piston? Il devrait y avoir plein de choses pour le rendre plus facile.

(ne suis pas sûr sérialisation spécifiquement, mais Django Resty services Web.)

+0

Façon de lire la question, djc;) Oui, j'ai regardé django-piston, et il pourrait finir par utiliser son sérialiseur. Je ne suis pas sûr si je veux utiliser le tout pour l'instant, parce que j'ai eu quelques expériences médiocres avec cela et j'envoie des données à Flash (à PyAMF fait un travail beaucoup plus agréable) ... Mais, bien sûr, cela pourrait tout changer: P –

+0

Oups, désolé à ce sujet! – djc

1

Lorsque j'ai besoin vraiment rapide sérialisation personnalisée et mon cas ne nécessite pas désérialisation j'écris juste modèle de django qui peut faire tout format que je veux de liste/jeu de requête/objet. Vous pouvez ensuite appeler render_to_string avec le contexte approprié et vous avez vos données sérialisées.

MISE À JOUR: quelques exemples court

Disons que vous voulez obtenir le format JSON accepté par datatables.net plugin. Comme il y a des paramètres spéciaux requis pour sérialiser le jeu de queries en utilisant simplejson ou sth else est impossible ici (ou peut-être pas si facile au moins). Nous avons constaté que meilleur moyen de fournir une telle structure est de créer des modèles simples comme celui-ci:

{ 
    "sEcho": {{sEcho}}, 
    "iTotalRecords": {{iTotalRecords}}, 
    "iTotalDisplayRecords": {{iTotalDisplayRecords}}, 
    "aaData":[ 
    {% for obj in querySet %} 
    [ 
     "{{obj.name}}", 
     "{{obj.message|truncatewords:20}}", 
     "<a href=\"{% url some_view obj.id %}\">{{obj.name}}</a>" 
    ] 
    {% if not forloop.last %} 
    , 
    {% endif %} 
    {% endfor %} 
    ] 
} 

qui rend à beatiful JSON que nous recherchions. Cela vous donne un contrôle total sur le format. D'autres avantages sont l'abilité de modifier les champs d'objets en utilisant des filtres django intégrés qui, dans notre cas, étaient vraiment utiles. Je sais que ce n'est pas la sérialisation comme décrit dans les livres, mais si vous voulez convertir un objet en un format personnalisé, cette solution pourrait être la plus rapide. Pour une raison quelconque, les développeurs django autorisés à rendre le modèle à un format donné non seulement html, alors pourquoi ne pas l'utiliser?

L'exemple ci-dessus est très spécifique mais vous pouvez générer tout autre format. Bien sûr, l'écriture de désérialiseur pour cela pourrait restaurer l'objet de ce format, mais si vous n'en avez pas besoin ...

+0

ಠ_ಠ cela ressemble à une recette pour la douleur. Ne serait-il pas plus facile de convertir manuellement les données en un objet "basique" puis d'utiliser json/whatever pour sérialiser cela? –

+0

non ce n'est pas. Vous avez personnellement mentionné que certains sérialiseurs produisaient des données en fonction de leur strcture spécifique. Je l'utilise pour générer du format json qui était trop difficile à obtenir autrement. Bien sûr, si vous avez une idée de la façon d'écrire sérialiseur - faites-le :) – dzida

+0

Très bien, eh bien, peut-être que je ne suis pas assez créatif. Pourriez-vous donner un petit exemple de ce à quoi vous pensez? Par exemple, je pense à quelque chose comme ceci: 'serialized = [{" name ": person.name," friends ": [{" name ": friend.name} pour un ami dans person.friends.all() ]} pour la personne chez les personnes]; return simplejson.dumps (sérialisé); ' –

1

EDIT:

Maintenant, sortez à https://bitbucket.org/sebpiq/any2any/


Je vous écris actuellement un cadre de sérialisation complet pour Django. Le but est précisément d'avoir un contrôle total sur la sérialisation. Cela remplirait probablement vos exigences plutôt bien! Cependant, il n'est pas encore prêt. J'estime que dans 1 ou 2 semaines je serai en mesure de sortir une première version.

Vous pouvez toujours vérifier le code google: http://code.google.com/p/django-serializable/, même donner de l'aide si cela vous intéresse.

Il y aura un téléchargement en vedette lorsque la première version sera disponible!

+0

Génial! J'ai ajouté les flux RSS à mon lecteur et j'ai hâte de voir ce que vous avez publié. –

+0

Bonjour David! Ce n'est pas encore prêt, parce que j'ai été très occupé sur d'autres sujets dernièrement, mais vous pouvez le vérifier: il peut déjà sérialiser/désérialiser les modèles, et leurs parents. Le seul problème étant que ce n'est pas encore très stable ... – sebpiq

Questions connexes