Django QuerySetを辞書のリストに変換するにはどうすればよいですか?


122

Django QuerySetを辞書のリストに変換するにはどうすればよいですか?私はこれに対する答えを見つけられなかったので、誰もが使用するある種の一般的なヘルパー関数がないのではないかと思っています。

回答:


176

次の.values()方法を使用します。

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

注:結果は、QuerySetほとんどがリストのように動作しますが、実際にはのインスタンスではありませんlist。のlist(Blog.objects.values(…))インスタンスが本当に必要な場合に使用しますlist


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

10
ただし、実際にはリストは返されません
astreltsov 2017年

また、を使用してオブジェクトのインスタンスメソッドの結果を取得するvalues()ことはできません。values()インスタンスメソッドの呼び出しと同じことを行うのに適したメソッドがあるかどうかはわかりません。
アサラ

34

この.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

17
または、これを使用してリストへの変換を簡略化できますlist(result)
Adiyat Mubarak

12

何らかの理由(JSONシリアライゼーションなど)でネイティブデータタイプが必要な場合は、これが簡単な「n」ダーティな方法です。

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

あなたが見ることができるようにリスト内のdictの構築は実際にはDRYではないので、誰かがより良い方法を知っているなら...


私はそれを使っdata = list( blogs )てそれを使っているようですjson.dumps( data )。配列は、JavaScript側に多数のオブジェクトが含まれているため、構文解析は必要ありません。
Arthur Tarasov

3

辞書がどのように見えるかを正確に定義するわけではありませんが、ほとんどの場合、を参照していQuerySet.values()ます。公式のDjangoのドキュメント

aを返しますValuesQuerySetQuerySetモデルインスタンスオブジェクトではなく反復可能オブジェクトとして使用すると、辞書を返すサブクラスです。

これらの各ディクショナリはオブジェクトを表し、キーはモデルオブジェクトの属性名に対応しています。



1

values()クエリを実行するDjangoモデルフィールドから取得したdictでこのメソッドを使用すると、インデックス値によって各フィールドに簡単にアクセスできます。

このように呼んでください-

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



0

次のように、model_to_dictを使用して関数を定義できます。

def queryset_to_dict(qs,fields=None, exclude=None):
    my_array=[]
    for x in qs:
        my_array.append(model_to_dict(x,fields=fields,exclude=exclude))
    return my_array
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.