あなたが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月更新:
元の意図をよりよく反映するようにタイトルを変更しました。
これは実際の辞書を作成する必要がありますか?あなたは辞書のように見えるものだけでうまくいくことができますか?
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=[])
クエリから辞書のリストを取得できる 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'}]
ドキュメントによると、in_bulk
querysetメソッドが必要です。
主キー値のリストを取得し、各主キー値を特定のIDを持つオブジェクトのインスタンスにマッピングする辞書を返します。
IDのリストを取得するため、最初にvalues_list
メソッドを使用して取得する必要があります。
ids = MyModel.objects.values_list('id', flat=True)
model_dict = MyModel.objects.in_bulk(ids)
python
serializer を使用できます。
from Django.core import serializers
data = serializers.serialize('python', DictModel.objects.all())
dict((x.name, getattr(o, x.name)) for x in o._meta.fields)
使用する
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())
おそらく私は何かを見逃していますが、Djangoオブジェクトには__dict__
属性はあなたが望むものです。
user = mymodel.objects.all()
user.values()
試すこともできます
user.values_list() # getting as list
または、次のようなことをしようとしていましたか?
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)
指定されたモデルフィールドをキーとして、クエリセット内のすべてのインスタンスのマップを単一のディクショナリに取得するには、これを実行してみてください
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
モデルの値をディクショナリに取得するには、そのディクショナリが必要な場所に以下のコードを追加します
from models import DictModel
activity_map = dict(Plan.objects.values_list('key', 'value'))
activity_mapは、必要な情報を含む辞書です。