首頁 >後端開發 >Python教學 >如何將 Django 模型物件轉換為包含所有欄位(包括外鍵和「editable=False」欄位)的字典?

如何將 Django 模型物件轉換為包含所有欄位(包括外鍵和「editable=False」欄位)的字典?

Susan Sarandon
Susan Sarandon原創
2024-10-30 08:30:27474瀏覽

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

將Django 模型物件轉換為包含所有欄位的字典

問題

如何將Django 模型物件轉換為包含其所有欄位的字典,包括外鍵和標記為editable=False 的欄位?

有幾種方法可以實現此目的:

1.使用instance.__dict__

instance.__dict__

但是,這種方法包含不相關的屬性,並且可能不包含多對多關係。

2.使用 model_to_dict

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

此方法捕獲多對多關係,但排除不可編輯的欄位。

3.自訂函數

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

此函數會擷取所有字段,包括外鍵 ID 和多對多關係。

4.模型序列化器

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

SomeModelSerializer(instance).data

模型序列化器提供全面的表示,但可能不會總是準確地傳回日期時間物件。

5.可列印模型

要增強控制台中的模型表示,請定義基本模型類別:

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

繼承此基本模型以自動列印字典而不是預設模型表示。

以上是如何將 Django 模型物件轉換為包含所有欄位(包括外鍵和「editable=False」欄位)的字典?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn