it-swarm-id.com

Bagaimana cara mengubah Django QuerySet ke daftar dicts?

Bagaimana saya bisa mengubah Django QuerySet menjadi daftar dicts? Saya belum menemukan jawaban untuk ini jadi saya bertanya-tanya apakah saya kehilangan semacam fungsi pembantu umum yang digunakan semua orang.

81

Gunakan metode .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'}]

Catatan: hasilnya adalah QuerySet yang sebagian besar berperilaku seperti daftar, tetapi sebenarnya bukan turunan dari list. Gunakan list(Blog.objects.values(…)) jika Anda benar-benar membutuhkan turunan list.

116
David Wolever

The .values() metode akan mengembalikan Anda hasil dari jenis ValuesQuerySet yang biasanya apa yang Anda butuhkan dalam kebanyakan kasus.

Tetapi jika Anda mau, Anda bisa mengubah ValuesQuerySet menjadi daftar Python asli menggunakan pemahaman daftar Python seperti yang diilustrasikan dalam contoh di bawah ini.

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

Saya menemukan hal di atas membantu jika Anda menulis unit test dan perlu menegaskan bahwa nilai kembali yang diharapkan dari suatu fungsi cocok dengan nilai balik yang sebenarnya, dalam hal ini expected_result dan actual_result harus dari jenis yang sama (mis. Kamus).

actual_result = some_function()
expected_result = {
    # dictionary content here ...
}
assert expected_result == actual_result
22
Arthur Rimbun

Jika Anda memerlukan tipe data asli karena beberapa alasan (mis. Serialisasi JSON) ini adalah cara cepat dan kotor saya untuk melakukannya:

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

Seperti yang Anda lihat, membangun dict di dalam daftar sebenarnya bukan DRY jadi jika seseorang mengetahui cara yang lebih baik ...

7
Semmel

Anda tidak mendefinisikan dengan tepat seperti apa kamus itu, tetapi kemungkinan besar Anda merujuk ke QuerySet.values(). Dari dokumentasi resmi Django :

Mengembalikan ValuesQuerySet - a QuerySet subclass yang mengembalikan kamus saat digunakan sebagai versi yang dapat diubah, dan bukan model-contoh benda.

Masing-masing kamus tersebut mewakili suatu objek, dengan kunci sesuai dengan nama atribut objek model.

3
Bernhard Vallant

Anda memerlukan DjangoJSONEncoder dan list untuk membuat Queryset Anda menjadi json, ref: Python JSON membuat serial objek Decimal

import json
from Django.core.serializers.json import DjangoJSONEncoder


blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
0
gaozhidf

Anda dapat menggunakan metode values() pada dict yang Anda dapatkan dari bidang model Django tempat Anda membuat kueri, dan kemudian Anda dapat dengan mudah mengakses setiap bidang dengan nilai indeks.

Sebut saja seperti ini - 

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

Sederhananya list(yourQuerySet).

0
Miguel Matos