J'ai un problème de sérialisation des modèles hérités de Django. Par exemple et seul modèle de chien a été sérialisé. P> Je peux faire smth comme p> 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. p> aucune idée de la procédure à suivre pour sérialiser les modèles Django avec la classe mère? P> P> ** 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. P> P>
5 Réponses :
Avez-vous regardé select_related () code>?
comme dans
Cela n'aide pas: select_related code> n'affecte pas la gestion des modèles parent de Django Serializer.
Select_Related code> 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 code> ou
animal code> vers d'autres modèles, il n'y a donc absolument aucun avantage à utiliser
select_related () code>.
Vous avez trouvé votre réponse dans la documentation du patch. 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)
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: Afin de l'utiliser seul, vous devez faire: P> serializer = AllFieldsSerializer()
serializer.serialize(queryset, fields=fields)
print serializer.getvalue()
Vous pouvez définir un sérialiseur personnalisé: l'utiliser comme: p>
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 :) P > et l'extrait: p>
Pourquoi voulez-vous sérialiser quelque chose qui est, à la fin, conçu pour cartographier des données dans une base de données?