32

私の Django アプリで、モデルからのオブジェクトを、モデル オブジェクトの外部キー参照を含むディクショナリに変換するにはどうすればよいですか?

これを試すと:

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])

結果のディクショナリには直接フィールドのみが含まれます。Model オブジェクトに関連する外部キーも取得したいと思います。これどうやってするの?

4

6 に答える 6

31
obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__
于 2012-09-12T07:21:25.720 に答える
7

私はあなたと同じニーズを持っていたと思います-オブジェクトの単純で単純な辞書表現が欲しかったのです。(私が書いている時点で)投稿された他の回答ではそれが得られず、シリアライザーは目的には役立ちますが、不要な追加情報と不便な構造を含む出力を生成します。

確かにハックですが、これは私に良いマイレージを与えています:

from django.core import serializers

def obj_to_dict(model_instance):
    serial_obj = serializers.serialize('json', [model_instance])
    obj_as_dict = json.loads(serial_obj)[0]['fields']
    obj_as_dict['pk'] = model_instance.pk
    return obj_as_dict

リストでdjango_model_objectをラップし、jsonを解析した後にアイテム0にアクセスする必要があります。これは、何らかの理由で、シリアライザーがモデルオブジェクトのイテラブルのみをシリアライズできるためです(奇妙な)。

あらゆる種類の外部キー フィールドを処理するには、追加のギアが必要です。それを記述する必要が生じた場合は、投稿することがあります (他の誰かが最初に編集しない限り!)。

とりあえずHTH。

于 2014-06-29T02:50:38.030 に答える
7

どうですか:

model_to_dict(instance, fields=[field.name for field in instance._meta.fields])

すべてのフィールドに明示的に名前を付けることで、少なくとも外部キー ID が得られるはずです (確認はしていませんが)。

この関数はフィールドを返さないことに注意してくださいeditable=False(フォーム用であるため)。

于 2013-11-21T00:57:40.817 に答える
0

この問題はすでに解決されていると思いますが、同様の解決策を探していたときにいくつかの情報を見つけました。テンプレート内のオブジェクトとそのフィールド/属性にアクセスできるようにしたかったのです。私はジャンゴを学んでいます。

私が最終的に読んだのはhttps://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-display/で、オブジェクトインスタンスまたはクエリセットを送信できるようですテンプレートに沿ったオブジェクト。次に、 のようなオブジェクトにアクセスできます。model.fieldまた、foreignkey フィールドの場合でもmodel.foreignmodel.foreignmodelfield.

だから私にとってはかなり役に立ちました。これは、さまざまなクラス マネージャーで多数のカスタム 'to-dict' メソッドを作成した後でした。これは私を大いに助けました。ただし、必要な詳細を実際に取得するには、汎用ビューとそれらをカスタマイズする方法をよく読む必要があります。

-マット

于 2016-03-21T21:02:54.770 に答える
0

関連するモデルを操作したい場合は、 Django のシリアライゼーションを参照してください。

于 2012-09-12T07:03:22.613 に答える
0

他の答えはどれも私にとってはうまくいきませんでした。しかし、これはうまくいくように見えました。

def model_to_dict(instance, include=None, exclude=None):
    fields = instance._meta.concrete_fields
    if include is not None:
        return {f.attname: getattr(instance, f.attname) for f in fields if f.name in include}
    if exclude is not None:
        return {f.attname: getattr(instance, f.attname) for f in fields if f.name not in exclude}
    return {f.attname: getattr(instance, f.attname) for f in fields}
于 2016-03-03T23:40:00.577 に答える