Comment sérialiser en JSON une liste des objets du modèle dans django/python
Je suis en train de sérialiser une liste d'objets définis comme:
class AnalysisInput(models.Model):
input_user = models.CharField(max_length=45)
input_title = models.CharField(max_length=45)
input_date = models.DateTimeField()
input_link = models.CharField(max_length=100)
J'ai écrit une coutume sérialiseur (codeur) pour json.décharges():
class AnalysisInputEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, AnalysisInput):
return { "input_id" : obj.id,
"input_user" : obj.input_user,
"input_title" : obj.input_title,
"input_date" : obj.input_date.isoformat(),
"input_link" : obj.input_link }
return json.JSONEncoder.default(self, obj)
Quand je sérialiser un seul objet, je suis en mesure de le faire. Lorsque j'essaie de sérialiser une liste d'objet-je obtenir
[ objects..] is not JSON serializable
J'ai cherché mais je n'ai pas trouver l'endroit où le travail sur.. je pensais à la rédaction d'un personnalisé sérialiseur aussi pour la liste d'objets.
Vous devez vous connecter pour publier un commentaire.
Personnalisé codeur n'est pas appelée récursivement. Vous sont effectivement mieux pas à l'aide d'un codeur personnalisé, et, au lieu de convertir vos objets simples python les types de sérialisation.
Vous pouvez ajouter un
as_json
ou de même nom que la méthode à votre modèle et l'appel que chaque fois que vous avez besoin d'un résultat JSON:Alors à votre avis:
__json__
méthodes sur les résultats par exemple.unbound method as_json() must be called with Category instance as first argument
as_dict(self)
plutôt car il n'est pas vraiment un retour json...La meilleure façon que j'ai trouvée pour sérialiser vos Django modèles est par l'utilisation de
django.core.serializers
pour sérialiser votre modèle de liste en JSON, XML ou YAML. Aucun code de sérialisation nécessaire! La Documentation est ici: https://docs.djangoproject.com/en/dev/topics/serialization/Voici mon oeuvre:
lead/models.py:
lead/views.py:
Le résultat final:
Solution la plus simple: