Maison  >  Article  >  développement back-end  >  Comment convertir un objet Django Model en un dictionnaire avec tous les champs, y compris les clés étrangères et les champs « editable=False » ?

Comment convertir un objet Django Model en un dictionnaire avec tous les champs, y compris les clés étrangères et les champs « editable=False » ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 08:30:27356parcourir

How do you convert a Django Model object to a dictionary with all fields, including foreign keys and `editable=False` fields?

Convertir les objets du modèle Django en dictionnaires avec tous les champs

Problème

Comment convertir un objet du modèle Django en un dictionnaire qui inclut tous ses champs, y compris les clés étrangères et les champs marqués comme editable=False?

Solution

Il existe plusieurs méthodes pour y parvenir :

1. Utilisation de instance.__dict__

instance.__dict__

Cependant, cette approche inclut des attributs non pertinents et peut ne pas inclure de relations plusieurs-à-plusieurs.

2. Utilisation de model_to_dict

from django.forms.models import model_to_dict
model_to_dict(instance)

Cette méthode capture les relations plusieurs-à-plusieurs mais exclut les champs non modifiables.

3. Fonction personnalisé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 tous les champs, y compris les identifiants de clé étrangère et les relations plusieurs-à-plusieurs.

4. Sérialiseurs de modèles

from rest_framework import serializers
class SomeModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = SomeModel
        fields = "__all__"

SomeModelSerializer(instance).data

Les sérialiseurs de modèles fournissent une représentation complète, mais ne renvoient pas toujours les objets datetime avec précision.

5. Modèle imprimable

Pour améliorer la représentation du modèle dans la console, définissez une classe de modèle de base :

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 code as in the Custom Function)

    class Meta:
        abstract = True

Héritez de ce modèle de base pour imprimer automatiquement des dictionnaires au lieu des représentations de modèle par défaut.

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!

Déclaration:
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