Django QuerySetを辞書のリストに変換するにはどうすればよいですか?私はこれに対する答えを見つけられなかったので、誰もが使用するある種の一般的なヘルパー関数がないのではないかと思っています。
Django QuerySetを辞書のリストに変換するにはどうすればよいですか?私はこれに対する答えを見つけられなかったので、誰もが使用するある種の一般的なヘルパー関数がないのではないかと思っています。
回答:
次の.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。
values()ことはできません。values()インスタンスメソッドの呼び出しと同じことを行うのに適したメソッドがあるかどうかはわかりません。
この.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_resultとactual_result同じ型でなければならない(例えば辞書)。
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
何らかの理由(JSONシリアライゼーションなど)でネイティブデータタイプが必要な場合は、これが簡単な「n」ダーティな方法です。
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
あなたが見ることができるようにリスト内のdictの構築は実際にはDRYではないので、誰かがより良い方法を知っているなら...
data = list( blogs )てそれを使っているようですjson.dumps( data )。配列は、JavaScript側に多数のオブジェクトが含まれているため、構文解析は必要ありません。
辞書がどのように見えるかを正確に定義するわけではありませんが、ほとんどの場合、を参照していQuerySet.values()ます。公式のDjangoのドキュメント:
aを返します
ValuesQuerySet—QuerySetモデルインスタンスオブジェクトではなく反復可能オブジェクトとして使用すると、辞書を返すサブクラスです。これらの各ディクショナリはオブジェクトを表し、キーはモデルオブジェクトの属性名に対応しています。
リストに型キャスト
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
あなたが必要DjangoJSONEncoderとlistするためQuerysetにjson、参照:Python JSONがDecimalオブジェクトをシリアル化する
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
values()、引数として渡して、返すフィールドを指定します。また、値はリストのリストでは<class 'django.db.models.query.ValuesQuerySet'>なく実際の辞書のリストを返すように見えますが、注意してください。