Ada banyak dokumentasi tentang cara membuat serialisasi Model QuerySet tetapi bagaimana Anda hanya membuat serial ke JSON bidang-bidang Model Instance?
python
django
json
django-models
serialization
Jason Christa
sumber
sumber
django.core
untuk melakukan ini. Ada alasan khusus untuk tidak menggunakan serialisasi queryset?Jawaban:
Anda dapat dengan mudah menggunakan daftar untuk membungkus objek yang diperlukan dan itu semua yang diperlukan serializer django untuk membuat serialisasi dengan benar, misalnya .:
sumber
[0]
di akhir baris terakhir Anda, seperti yang disarankan @DavorLucic? Dan tidak perlu untuk mengikuti koma dalam daftar Anda secara literal (untuk cinta PEP8;).Jika Anda berurusan dengan daftar contoh model yang terbaik yang dapat Anda lakukan adalah menggunakannya
serializers.serialize()
, itu akan sesuai dengan kebutuhan Anda dengan sempurna.Namun, Anda harus menghadapi masalah dengan mencoba membuat serialisasi objek tunggal , bukan
list
objek. Dengan begitu, untuk menyingkirkan hack yang berbeda, gunakan saja Djangomodel_to_dict
(jika saya tidak salah,serializers.serialize()
andalkan juga):Anda sekarang hanya perlu satu
json.dumps
panggilan langsung untuk membuat serial menjadi json:Itu dia! :)
sumber
datetime
bidang. Dipecahkan dengan cara inijson.loads(serialize('json', [obj]))[0]
sementara serializer adalahdjango.core.serializers.serialize
Untuk menghindari pembungkus array, hapus sebelum Anda mengembalikan respons:
Saya menemukan posting yang menarik ini pada subjek juga:
http://timsaylor.com/convert-django-model-inances-to-dictionaries
Ini menggunakan django.forms.models.model_to_dict, yang terlihat seperti alat yang sempurna untuk pekerjaan itu.
sumber
Ada jawaban yang bagus untuk ini dan saya terkejut belum disebutkan. Dengan beberapa baris Anda dapat menangani tanggal, model, dan yang lainnya.
Buat pembuat enkode khusus yang dapat menangani model:
Sekarang gunakan saat Anda menggunakan json.dumps
Sekarang model, tanggal dan semuanya dapat diserialisasi dan tidak harus dalam array atau serial dan tidak di-serial. Apa pun yang Anda miliki yang dapat ditambahkan hanya dapat ditambahkan ke
default
metode.Anda bahkan dapat menggunakan JsonResponse asli Django dengan cara ini:
sumber
json.dumps
dan keduanyajson.dump
. Dengan cara ini Anda tidak perlu mengubah alur kerja aplikasi karena Anda menggunakan objek khusus atau menambahkan pemanggilan metode lain sebelum mengonversi ke json. Cukup tambahkan kode konversi Anda di enkoder dan Anda siap berangkat.Kedengarannya seperti apa yang Anda tanyakan melibatkan serialisasi struktur data model Django misalnya untuk interoperabilitas. Poster-poster lain benar: jika Anda ingin formulir berseri untuk digunakan dengan aplikasi python yang dapat meminta basis data melalui api Django, maka Anda akan ingin membuat cerita bersambung sebuah queryset dengan satu objek. Jika, di sisi lain, apa yang Anda butuhkan adalah cara untuk kembali mengembang contoh model di tempat lain tanpa menyentuh database atau tanpa menggunakan Django, maka Anda memiliki sedikit pekerjaan yang harus dilakukan.
Inilah yang saya lakukan:
Pertama, saya gunakan
demjson
untuk konversi. Kebetulan itulah yang saya temukan pertama kali, tetapi mungkin bukan yang terbaik. Implementasi saya tergantung pada salah satu fiturnya, tetapi harus ada cara yang serupa dengan konverter lainnya.Kedua, terapkan
json_equivalent
metode pada semua model yang mungkin Anda perlukan serial. Ini adalah metode ajaibdemjson
, tetapi ini mungkin sesuatu yang ingin Anda pikirkan terlepas dari penerapan apa yang Anda pilih. Idenya adalah Anda mengembalikan objek yang dapat langsung dikonversijson
(yaitu array atau kamus). Jika Anda benar-benar ingin melakukan ini secara otomatis:Ini tidak akan membantu Anda kecuali Anda memiliki struktur data yang benar-benar datar (tidak
ForeignKeys
, hanya angka dan string dalam database, dll.). Jika tidak, Anda harus dengan serius memikirkan cara yang tepat untuk menerapkan metode ini.Ketiga, telepon
demjson.JSON.encode(instance)
dan Anda memiliki apa yang Anda inginkan.sumber
Jika Anda bertanya bagaimana membuat serial objek tunggal dari model dan Anda tahu Anda hanya akan mendapatkan satu objek di queryset (misalnya, menggunakan objek.get), kemudian gunakan sesuatu seperti:
yang akan memberi Anda sesuatu berupa:
sumber
Saya memecahkan masalah ini dengan menambahkan metode serialisasi ke model saya:
Berikut ini adalah padanan verbose bagi mereka yang menolak untuk satu kalimat:
_meta.fields
adalah daftar bidang model yang dipesan yang dapat diakses dari instance dan dari model itu sendiri.sumber
Inilah solusi saya untuk ini, yang memungkinkan Anda untuk dengan mudah menyesuaikan JSON serta mengatur catatan terkait
Pertama menerapkan metode pada model. Saya menelepon
json
tetapi Anda bisa menyebutnya apa pun yang Anda suka, misalnya:Maka dalam tampilan saya lakukan:
sumber
car.json()
Gunakan daftar, itu akan menyelesaikan masalah
Langkah 1:
Langkah 2:
Step3:
sumber
Untuk membuat serial dan deserialze, gunakan yang berikut ini:
sumber
.values()
adalah apa yang saya butuhkan untuk mengonversi contoh model ke JSON.dokumentasi .values (): https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values
Contoh penggunaan dengan model yang disebut Project .
Catatan: Saya menggunakan Django Rest Framework
Hasil dari id yang valid:
sumber
Jika Anda ingin mengembalikan objek model tunggal sebagai respons json ke klien, Anda dapat melakukan solusi sederhana ini:
sumber
Gunakan Django Serializer dengan
python
format,Apa perbedaan antara
json
danpython
format?The
json
Format akan kembali hasil sebagaistr
sedangkanpython
akan kembali hasilnya baiklist
atauOrderedDict
sumber
OrderedDict
, tidakdict
Tampaknya Anda tidak bisa membuat serial suatu instance, Anda harus membuat serial suatu QuerySet dari satu objek.
Saya kehabisan
svn
rilis Django, jadi ini mungkin tidak ada di versi sebelumnya.sumber
Saya kembalikan contoh saya
jadi itu mengembalikan sesuatu seperti {'field1': value, "field2": value, ....}
sumber
TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
bagaimana dengan cara ini:
atau mengecualikan apa pun yang tidak Anda inginkan.
sumber
Semua jawaban ini sedikit berantakan dibandingkan dengan apa yang saya harapkan dari suatu kerangka kerja, metode paling sederhana, saya pikir sejauh ini, jika Anda menggunakan kerangka kerja sisanya:
Ini menggunakan Serializer secara langsung, menghormati bidang yang telah Anda tentukan, serta asosiasi apa pun, dll.
sumber