Heim  >  Artikel  >  Backend-Entwicklung  >  Wie konvertiert man ein Django-Modellobjekt in ein Wörterbuch mit allen Feldern, einschließlich Fremdschlüsseln und „editable=False“-Feldern?

Wie konvertiert man ein Django-Modellobjekt in ein Wörterbuch mit allen Feldern, einschließlich Fremdschlüsseln und „editable=False“-Feldern?

Susan Sarandon
Susan SarandonOriginal
2024-10-30 08:30:27356Durchsuche

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

Django-Modellobjekte in Wörterbücher mit allen Feldern konvertieren

Problem

Wie konvertiert man ein Django-Modellobjekt in ein Wörterbuch, das alle seine Felder enthält? Felder, einschließlich Fremdschlüssel und Felder, die als bearbeitbar = Falsch markiert sind?

Lösung

Es gibt mehrere Methoden, um dies zu erreichen:

1. Verwendung von example.__dict__

instance.__dict__

Dieser Ansatz umfasst jedoch irrelevante Attribute und möglicherweise keine Viele-zu-Viele-Beziehungen.

2. Verwenden von model_to_dict

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

Diese Methode erfasst Viele-zu-Viele-Beziehungen, schließt jedoch nicht bearbeitbare Felder aus.

3. Benutzerdefinierte Funktion

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

Diese Funktion ruft alle Felder ab, einschließlich Fremdschlüssel-IDs und Viele-zu-Viele-Beziehungen.

4. Modellserialisierer

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

SomeModelSerializer(instance).data

Modellserialisierer bieten eine umfassende Darstellung, geben Datum/Uhrzeit-Objekte jedoch möglicherweise nicht immer genau zurück.

5. Druckbares Modell

Um die Modelldarstellung in der Konsole zu verbessern, definieren Sie eine Basismodellklasse:

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

Erben Sie von diesem Basismodell, um automatisch Wörterbücher anstelle von Standardmodelldarstellungen zu drucken.

Das obige ist der detaillierte Inhalt vonWie konvertiert man ein Django-Modellobjekt in ein Wörterbuch mit allen Feldern, einschließlich Fremdschlüsseln und „editable=False“-Feldern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn