web-dev-qa-db-ja.com

Django:モデルのオブジェクトのセット全体を単一の辞書に変換する

あなたがGoogleから口述するモデルを探しに来たなら、私の質問を飛ばして、最初の答えにジャンプしてください。私の質問はあなたを混乱させるだけです。

Djangoにモデルのオブジェクトのセット全体を単一の辞書に入れる良い方法はありますか?

class DictModel(models.Model):
    key = models.CharField(20)
    value = models.CharField(200)


DictModel.objects.all().to_dict()

...結果は、モデルのレコードで構成されたキー/値のペアを持つ辞書になりますか?他の誰かがこれを彼らにとって有用であると考えましたか?

ありがとう。

更新
追加したかったのは、テンプレート内で単純な変数検索を実行できるようにすることが私の最終的な目標であることです。何かのようなもの:

{{ DictModel.exampleKey }}

DictModel.objects.get(key__exact = exampleKey).valueの結果で

全体として、しかし、皆さんは、あなたの反応のすべてがどれほど役立つか、そしてそれへのアプローチ方法がどれほど異なる可能性があるかに本当に驚いています。どうもありがとう。

2011年10月更新:この質問は、「Django model_to_dict」をGoogleで検索した場合の一番の結果です。

私が望んでいたのは、指定されたモデルフィールドをキーとして、クエリセット内のすべてのインスタンスを単一の辞書にマップできるようにすることでした。
一方、 model_to_dictは、単一のモデルインスタンスを辞書に変換します。

今、当時の私のニーズは非常に具体的で、おそらく非常にまれでした(私はそれを必要としていたプロジェクト、またはその理由を思い出すことさえできません)。ですから、model_to_dictに関する情報を探している人が誰でも私の質問が実際に役立つことに気付くのはかなり驚くでしょう。ごめんなさい。

model_to_dictは、私が持っていたよりもはるかに一般的な使用例のようです。

2011年12月更新:
元の意図をよりよく反映するようにタイトルを変更しました。

59
LarrikJ

これは実際の辞書を作成する必要がありますか?あなたは辞書のように見えるものだけでうまくいくことができますか?

class DictModelAdaptor():
    def __init__(self, model):
        self.model = model

    def __getitem__(self, key):
        return self.model.objects.get(key=key)

    def __setitem__(self, key, item):
        pair = self.model()
        pair.key = key
        pair.value = item
        pair.save()

    def __contains__(self, key):
        ...

次に、この方法でモデルをラップできます。

modelDict = DictModelAdaptor(DictModel)
modelDict["name"] = "Bob Jones"

等...

Djangoすでに記述されているコード;)に依存することもできます。

from Django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
213
Arthur Debert

クエリから辞書のリストを取得できる QuerySetの値メンバー を探しています

ValuesQuerySet-モデルインスタンスオブジェクトの代わりに辞書のリストを評価するQuerySetを返します。これらの各辞書はオブジェクトを表し、キーはモデルオブジェクトの属性名に対応しています。

>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
27
Tom Leys

ドキュメントによると、in_bulk querysetメソッドが必要です。

主キー値のリストを取得し、各主キー値を特定のIDを持つオブジェクトのインスタンスにマッピングする辞書を返します。

IDのリストを取得するため、最初にvalues_listメソッドを使用して取得する必要があります。

ids = MyModel.objects.values_list('id', flat=True)
model_dict = MyModel.objects.in_bulk(ids)
16
Daniel Roseman

pythonserializer を使用できます。

from Django.core import serializers
data = serializers.serialize('python', DictModel.objects.all())
14
Luper Rouch

dict((x.name, getattr(o, x.name)) for x in o._meta.fields)

6
tug

使用する

dict(((m.key, m.value) for m in DictModel.objects.all())

Tom Leysが示唆したように、オブジェクト全体を取得する必要はありません。必要な値のみを取得できます。

dict(((m['key'], m['value']) for m in DictModel.objects.values('key', 'value')))

また、すべての値が必要な場合は、オブジェクト全体を辞書に保持することをお勧めします。

dict(((m.key, m) for m in DictModel.objects.all())
5
Anurag Uniyal

おそらく私は何かを見逃していますが、Djangoオブジェクトには__dict__属性はあなたが望むものです。

4
bjw
user = mymodel.objects.all()
user.values() 

試すこともできます

user.values_list() # getting as list
2
Rajan Mandanka

または、次のようなことをしようとしていましたか?

def someview(req):
    models = MyModel.objects.all()
    toTuple = lambda field: (getattr(field, 'someatt'), getattr(field, 'someotheratt'))  
    data = dict(map(toTuple,models))
    return render_to_response(template, data)
2
Shea Kauffman

指定されたモデルフィールドをキーとして、クエリセット内のすべてのインスタンスのマップを単一のディクショナリに取得するには、これを実行してみてください

from Django.forms.models import model_to_dict
from myApp.models import myModel

allObjs = myModel.objects.all()
f = {}         # initialise the output
key = 'key'    # one of the fields from myModel

[f.update({x[key]: x}) for x in [model_to_dict(y) for y in allObjs]]
return f
2
iancoleman

モデルの値をディクショナリに取得するには、そのディクショナリが必要な場所に以下のコードを追加します

from models import DictModel

activity_map = dict(Plan.objects.values_list('key', 'value'))

activity_mapは、必要な情報を含む辞書です。

2
eswar