Conversion d'objets de modèle Django en dictionnaires avec conservation complète des champs
Lorsque vous travaillez avec des objets de modèle Django, il est souvent nécessaire de les convertir en dictionnaires pour faciliter la manipulation ou la sérialisation des données. Cependant, il peut être difficile d'y parvenir tout en préservant tous les champs, y compris les clés étrangères et les valeurs marquées comme « non modifiables ».
Limitations des approches existantes
Plusieurs les méthodes de conversion d'objets de modèle en dictionnaires échouent de diverses manières :
Solution personnalisée
Pour remédier à ces limitations, une fonction personnalisée peut être implémentée :
from itertools import chain def to_dict(instance): opts = instance._meta data = {} for f in chain(opts.concrete_fields, opts.private_fields): data[f.name] = f.value_from_object(instance) for f in opts.many_to_many: data[f.name] = [i.id for i in f.value_from_object(instance)] return data
Cette fonction récupère les valeurs de tous les champs, y compris ceux marqués comme « non modifiables ». Les clés étrangères sont converties en identifiants et les relations plusieurs-à-plusieurs sont préservées.
Exemple d'utilisation
instance = SomeModel(...) result_dict = to_dict(instance)
Sortie :
{'auto_now_add': ..., 'foreign_key': ..., 'id': ..., 'many_to_many': [...], 'normal_value': ..., 'readonly_value': ...}
Amélioration supplémentaire : impression améliorée du modèle
Pour améliorer le débogage et la visibilité des données, une classe de modèle imprimable peut être définie :
from django.db import models from itertools import chain class PrintableModel(models.Model): def __repr__(self): return str(self.to_dict()) def to_dict(instance): # Same implementation as the custom to_dict function ... class Meta: abstract = True
Sous-classement les modèles de PrintableModel leur fourniront une représentation condensée similaire au résultat de la fonction to_dict lors de l'appel de repr().
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!