#TIL: Update Fields Django ORM
Selama ini selama menggunakan Django saya terbiasa menggunakan dua cara ini, Save()
atau Update()
Save()
Cara ini sepertinya paling umum digunakan:
model = Model.objects.get(id=pk)
model.fields = 'text'
model.save()
Cara ini mempunyai "efek samping" berupa:
- Akan memanggil method
clean()
di model. - Akan memanggil signal yang terafiliasi dengan model terkait.
Update()
Cara kedua ini biasanya digunakan jika saya butuh update banyak data sekaligus dengan kriteria yang sama
model = Model.objects.filter(condition=condition).update(field=value)
Cara ini berbeda dengan Save()
karena tidak memiliki "efek samping" seperti memanggil signal tapi cara ini langsung mengubah ke level query.
Kemarin, ketika menemukan sebuah issue, saya menemukan perbedaan yang cukup menarik ketika "query" model ini diterjemahkan menjadi "query sql".
Perhatikan kedua fungsi di atas, saya hanya mengubah satu kolom bukan? Tapi query yang dihasilkan berbeda.
Dengan metode Save()
query yang dihasilkan:
update model_table set field='xxx', other='xxx' ... where id=pk
Walaupun saya hanya mengubah satu kolom, Django ORM menerjemahkan semua kolom walau data yang berubah hanyalah kolom yang dituju.
Sedangkan jika menggunakan metode update()
query yang dihasilkan
update model_tabel set field=value where id=pk
Cara Update()
terlihat lebih aman, memastikan bahwa data yang lain tidak kita ubah hanya kolom yang dipilih.
Update Fields
Ketika membaca dokumentasi, saya menemukan cara ketiga yang sesuai keiinginan saya:
- Saya ingin hanya kolom yang dipilih yang diupdate, lebih aman menurut saya.
- Saya ingin validasi dari
clean()
dan fungsi signal tetap terpanggil
Caranya:
model = Model.objects.get(id=pk)
model.field=value
model.save(update_fields=['field',...])
Cara ini menghasilkan query yang serupa dengan update()
namun tetap menjaga bahwa hanya kolom yang dibutuhkan saja ketika akhirnya django menjalankan query di database.
Referensi:

Untuk mendapatkan informasi query dari Django ORM saya menggunakan paket python django extension.