8
votes

Django sérialisement du modèle hérité

J'ai un problème de sérialisation des modèles hérités de Django. Par exemple xxx

et seul modèle de chien a été sérialisé.

Je peux faire smth comme xxx

mais il Ça a l'air moche et parce que mes modèles sont très gros, alors je dois utiliser Sax Parser et avec une telle sortie, il est difficile d'analyser.

aucune idée de la procédure à suivre pour sérialiser les modèles Django avec la classe mère?

** Edition: ** Il utilise pour fonctionner correctement avant ce patch a été appliqué. Et l'explication pourquoi le patch exige "l'économie de modèle était trop agressive à propos de la création de nouvelles instances de classe parent lors de la désérialisation. Sauvegarde RAW sur un modèle passe maintenant à la sauvegarde de la classe mère." Je pense qu'il devrait y avoir une option pour pouvoir sérialiser "local champs uniquement "Par défaut et deuxième option -" Tous "- Pour sérialiser tous les champs hérités.


1 commentaires

Pourquoi voulez-vous sérialiser quelque chose qui est, à la fin, conçu pour cartographier des données dans une base de données?


5 Réponses :


0
votes

Avez-vous regardé select_related () ? comme dans xxx


2 commentaires

Cela n'aide pas: select_related n'affecte pas la gestion des modèles parent de Django Serializer.


Select_Related est une optimisation. Aucune donnée supplémentaire n'est renvoyée par le requérant. Il utilise simplement (potentiellement) moins de requêtes SQL pour obtenir des données référencées. Dans le cas ci-dessus, il n'y a pas de références à travers chien ou animal vers d'autres modèles, il n'y a donc absolument aucun avantage à utiliser select_related () .



1
votes

Vous avez trouvé votre réponse dans la documentation du patch. xxx pré>

Cependant, si vous modifiez animal code> pour être une classe de base abstraite, il fonctionnera: P>

class Animal(models.Model):
    color = models.CharField(max_length=50)

    class Meta:
        abstract = True

class Dog(Animal):
    name = models.CharField(max_length=50)


0 commentaires

1
votes

Vous aurez besoin d'un sérialisateur personnalisé pour soutenir des champs hérités, car le sérialiseur de Django ne fera que Serialiser des champs locaux.

J'ai fini par écrire le mien en rédigeant ce problème, n'hésitez pas à la copier: https://github.com/zmathew/django-backbone/blob/master/backbone/ Serializers.py P>

Afin de l'utiliser seul, vous devez faire: P>

serializer = AllFieldsSerializer()
serializer.serialize(queryset, fields=fields)
print serializer.getvalue()



0
votes

Vous pouvez définir un sérialiseur personnalisé: xxx

l'utiliser comme: xxx


0 commentaires

0
votes

J'ai eu le même problème et j'ai écrit un "petit" sérialiseur de queryset qui navigue dans l'arbre d'héritage et retourne tous les champs sérialisés.

C'est loin de parfait ... mais travaille pour moi :) xxx

et l'extrait: xxx


0 commentaires