Saya ingin memperbarui tabel dengan Django - sesuatu seperti ini di SQL mentah:
update tbl_name set name = 'foo' where name = 'bar'
Hasil pertama saya adalah sesuatu seperti ini - tapi itu tidak menyenangkan, bukan?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
Apakah ada cara yang lebih elegan?
django
django-models
Thomas Schwärzl
sumber
sumber
ModelClass
pendekatan itu? Kemudian beri makan ke Django sebagai: stackoverflow.com/questions/16853649/…Jawaban:
Memperbarui:
Versi Django 2.2 sekarang memiliki bulk_update .
Jawaban lama:
Rujuk ke bagian dokumentasi Django berikut ini
Singkatnya, Anda harus dapat menggunakan:
Anda juga dapat menggunakan
F
objek untuk melakukan hal-hal seperti menambah baris:Lihat dokumentasi .
Namun, perhatikan bahwa:
ModelClass.save
metode (jadi jika Anda memiliki beberapa logika di dalamnya tidak akan dipicu)..update()
pada irisan QuerySet, itu harus pada QuerySet asli sehingga Anda harus bersandar pada.filter()
dan.exclude()
metode.sumber
save()
,DateTimeField
bidang dengan kolomauto_now=True
("dimodifikasi") tidak akan diperbarui.ModelClass.objects.filter(name = 'bar').update(name="foo")
tidak memenuhi tujuan pembaruan massal, jika saya memiliki data berbeda untuk id berbeda bagaimana saya bisa melakukannya tanpa menggunakan loop?Entry.objects.all().update(title=F('blog__title'))
. Documents sedikit menyebutkan hal ini. Jika Anda ingin menarik data dari model lain untuk memperbarui entri Anda, Anda harus menjalankan loop forPertimbangkan untuk menggunakan yang
django-bulk-update
ditemukan di sini di GitHub .Install:
pip install django-bulk-update
Implement: (kode diambil langsung dari file proyek ReadMe)
Pembaruan: Seperti yang ditunjukkan Marc di komentar, ini tidak cocok untuk memperbarui ribuan baris sekaligus. Padahal itu cocok untuk batch yang lebih kecil, 10 hingga 100-an. Ukuran kumpulan yang tepat untuk Anda bergantung pada CPU Anda dan kompleksitas kueri. Alat ini lebih seperti gerobak dorong daripada dump truck.
sumber
Versi Django 2.2 sekarang memiliki
bulk_update
metode ( catatan rilis ).https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-update
Contoh:
sumber
Jika Anda ingin menetapkan nilai yang sama pada kumpulan baris , Anda dapat menggunakan metode pembaruan () yang dikombinasikan dengan istilah kueri apa pun untuk memperbarui semua baris dalam satu permintaan:
Jika Anda ingin memperbarui koleksi baris dengan nilai yang berbeda tergantung pada beberapa kondisi, Anda dapat mengumpulkan pembaruan sesuai dengan nilai. Katakanlah Anda memiliki 1000 baris di mana Anda ingin mengatur kolom ke salah satu nilai X, maka Anda bisa menyiapkan batch sebelumnya dan kemudian hanya menjalankan pembaruan-kueri X (masing-masing pada dasarnya memiliki bentuk contoh pertama di atas) + SELECT awal -pertanyaan.
Jika setiap baris membutuhkan nilai unik, tidak ada cara untuk menghindari satu permintaan per pembaruan. Mungkin melihat ke arsitektur lain seperti CQRS / Sumber acara jika Anda membutuhkan kinerja dalam kasus terakhir ini.
sumber
Anda dapat merujuk tautan ini untuk mendapatkan informasi lebih lanjut tentang pembuatan dan pembaruan massal. Pembaruan massal dan Buat
sumber