2011-10-18 178 views
56

Django QuerySetをdictsのリストに変換するにはどうすればよいですか?私はこれに対する答えを見つけていないので、誰もが使用する共通のヘルパー機能の一部が欠けているのだろうかと思っています。Django QuerySetをdictsのリストに変換するにはどうすればよいですか?

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

注:結果は、ほとんどのリストのように振る舞うが、実際listのインスタンスではないQuerySet

答えて

74

.values()方法を使用します。実際にlistのインスタンスが必要な場合は、list(Blog.objects.values(…))を使用してください。

+4

'values()'どのフィールドを引数として渡すかを指定します。値のように見えますが実際には 'django.db.models.query.ValuesQuerySet '>'というリストのリストを返すように見えますが、注意してください。 – dm03514

+1

これは実際にはリストを返しませんが – astreltsov

+0

ありがとう!更新しました。 –

2

辞書がどのように表示されるかを正確に定義していませんが、おそらくQuerySet.values()を参照している可能性があります。 official django documentationから:

ValuesQuerySetを返し - 反復可能ではなく、モデルインスタンス オブジェクトとして使用される場合 辞書を返すQuerySetサブクラス。

これらの各辞書は、モデルオブジェクトの属性名に対応する というキーを持つオブジェクトを表します。

14

.values()メソッドは、通常はほとんどの場合に必要なタイプValuesQuerySetの結果を返します。

希望すれば、ValuesQuerySetを以下の例に示すようにPythonのリストの理解を使ってネイティブのPythonリストにすることができます。

result = Blog.objects.values()    # return ValuesQuerySet object 
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list 
return list_result 

私はあなたが両方 expected_resultactual_resultは(同じタイプである必要があり、その場合には、ユニットテストを書くと機能の期待戻り値が実際の戻り値と一致していることを主張する必要がある場合は、上記に役立ちます見つけます辞書など)。

actual_result = some_function() 
expected_result = { 
    # dictionary content here ... 
} 
assert expected_result == actual_result 
+5

この 'list(result)'を使ってリストへの変換を簡単にすることができます。 –

0

あなたは、あなたが上のクエリを作成Djangoのモデルフィールドから得たdictの上values()メソッドを使用することができ、その後、あなたは簡単にインデックス値で、各フィールドにアクセスすることができます。

はこのようにそれを呼び出す -

myList = dictOfSomeData.values() 
itemNumberThree = myList[2] #If there's a value in that index off course... 
2

あなたには、いくつかの理由(例えばJSONのシリアライズ)のネイティブデータ型を必要とする場合、これはそれを行うには、私の迅速な「n」の汚いやり方です:

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs] 

あなたが見ることができるように、リスト内のdictを構築することは本当にDRYではありません。だから誰かがより良い方法を知っているなら...

関連する問題