#TIL: Update Fields Django ORM

#TIL: Update Fields Django ORM
Photo by Faisal / Unsplash

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:

Model instance reference | Django documentation
The web framework for perfectionists with deadlines.

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

Read more