Heim >Backend-Entwicklung >Python-Tutorial >Wie konvertiert man Django-Modellobjekte in Wörterbücher mit vollständiger Felderhaltung?

Wie konvertiert man Django-Modellobjekte in Wörterbücher mit vollständiger Felderhaltung?

Barbara Streisand
Barbara StreisandOriginal
2024-10-28 15:51:02965Durchsuche

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

Django-Modellobjekte in Wörterbücher mit vollständiger Felderhaltung konvertieren

Bei der Arbeit mit Django-Modellobjekten ist es häufig erforderlich, diese in Wörterbücher zu konvertieren um die Datenmanipulation oder Serialisierung zu erleichtern. Es kann jedoch schwierig sein, dies zu erreichen und gleichzeitig alle Felder beizubehalten, einschließlich Fremdschlüssel und Werte, die als „nicht bearbeitbar“ markiert sind.

Einschränkungen vorhandener Ansätze

Mehrere Gemeinsamkeiten Methoden zum Konvertieren von Modellobjekten in Wörterbücher sind in verschiedener Hinsicht unzureichend:

  • instance.__dict__: Schließt Viele-zu-Viele-Beziehungen aus und benennt Fremdschlüssel-IDs falsch.
  • model_to_dict: Lässt nicht bearbeitbare Felder weg.
  • model_to_dict(..., Fields=...): Verschärft die Einschränkungen des Standards model_to_dict.
  • query_set.values(): Ähnliche Ausgabe wie instance.__dict__, behält jedoch die falsche Benennung der Fremdschlüssel-ID bei und lässt Viele-zu-Viele-Beziehungen aus.

Benutzerdefinierte Lösung

Um diese Einschränkungen zu beheben, kann eine benutzerdefinierte Funktion implementiert werden:

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 Werte für alle Felder ab, einschließlich der als „nicht bearbeitbar“ markierten Felder. Fremdschlüssel werden in IDs umgewandelt und Viele-zu-Viele-Beziehungen bleiben erhalten.

Beispielverwendung

instance = SomeModel(...)
result_dict = to_dict(instance)

Ausgabe:

{'auto_now_add': ...,
 'foreign_key': ...,
 'id': ...,
 'many_to_many': [...],
 'normal_value': ...,
 'readonly_value': ...}

Zusätzliche Verbesserung: Verbesserter Modelldruck

Für verbessertes Debugging und Datensichtbarkeit kann eine druckbare Modellklasse definiert werden:

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

Unterklasse Modelle von PrintableModel stellen ihnen eine komprimierte Darstellung bereit, die dem Ergebnis der to_dict-Funktion beim Aufruf von repr() ähnelt.

Das obige ist der detaillierte Inhalt vonWie konvertiert man Django-Modellobjekte in Wörterbücher mit vollständiger Felderhaltung?. 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