Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda menukar objek Model Django kepada kamus dengan semua medan, termasuk kunci asing dan medan `editable=False`?

Bagaimanakah anda menukar objek Model Django kepada kamus dengan semua medan, termasuk kunci asing dan medan `editable=False`?

Susan Sarandon
Susan Sarandonasal
2024-10-30 08:30:27356semak imbas

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

Tukar Objek Model Django kepada Kamus dengan Semua Medan

Masalah

Bagaimanakah anda menukar objek Model Django kepada kamus yang merangkumi kesemuanya medan, termasuk kunci asing dan medan yang ditandakan sebagai boleh diedit=False?

Penyelesaian

Terdapat beberapa kaedah untuk mencapai ini:

1. Menggunakan instance.__dict__

instance.__dict__

Walau bagaimanapun, pendekatan ini termasuk atribut yang tidak berkaitan dan mungkin tidak termasuk perhubungan banyak-ke-banyak.

2. Menggunakan model_to_dict

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

Kaedah ini menangkap perhubungan banyak-ke-banyak tetapi mengecualikan medan yang tidak boleh diedit.

3. Fungsi Tersuai

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

Fungsi ini mendapatkan semula semua medan, termasuk id kunci asing dan perhubungan banyak-ke-banyak.

4. Pensiri Model

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

SomeModelSerializer(instance).data

Pensiri model menyediakan perwakilan yang komprehensif, tetapi mungkin tidak selalu mengembalikan objek masa tarikh dengan tepat.

5. Model Boleh Cetak

Untuk meningkatkan perwakilan model dalam konsol, tentukan kelas model asas:

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

Warisi daripada model asas ini untuk mencetak kamus secara automatik dan bukannya perwakilan model lalai.

Atas ialah kandungan terperinci Bagaimanakah anda menukar objek Model Django kepada kamus dengan semua medan, termasuk kunci asing dan medan `editable=False`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn