Comment convertir des objets de modèle Django en dictionnaires avec conservation complète des champs ?

Barbara Streisand
Libérer: 2024-10-28 15:51:02
original
828 Les gens l'ont consulté

How to Convert Django Model Objects to Dictionaries with Complete Field Retention?

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 :

  • instance.__dict__ : Exclut les relations plusieurs-à-plusieurs et nomme mal les ID de clé étrangère.
  • model_to_dict : Omet les champs non modifiables.
  • model_to_dict(..., field=...) : Exacerbe les limitations du standard model_to_dict.
  • query_set.values() : sortie similaire à instance.__dict__, mais conserve les noms erronés de l'ID de clé étrangère et omet les relations plusieurs-à-plusieurs.

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
Copier après la connexion

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)
Copier après la connexion

Sortie :

{'auto_now_add': ...,
 'foreign_key': ...,
 'id': ...,
 'many_to_many': [...],
 'normal_value': ...,
 'readonly_value': ...}
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!