KIRI SERTAI Django ORM: Alternatif kepada Pertanyaan SQL Mentah
Soalan:
Pertimbangkan model berikut:
class Volunteer(models.Model): ... class Department(models.Model): ... class DepartmentVolunteer(models.Model): ...
Untuk pertanyaan untuk semua jabatan tanpa sukarelawan yang ditugaskan, seseorang boleh menggunakan pernyataan SQL berikut:
SELECT d.name FROM vsp_department AS d LEFT JOIN vsp_departmentvolunteer AS dv ON d.id = dv.department_id WHERE dv.department_id IS NULL;
Adakah terdapat cara yang lebih mirip Django untuk melaksanakan pertanyaan ini, atau patutkah seseorang menggunakan SQL mentah?
Jawapan:
Django menyediakan cara yang lebih ringkas dan ekspresif untuk menjalankan pertanyaan yang sama menggunakan kaedah filter():
qs = Department.objects.filter( departmentvolunteer__isnull=True).values_list('name', flat=True)
Pertanyaan ini merangkumi hubungan berbilang nilai antara Jabatan dan Sukarelawan Jabatan, seperti yang diterangkan dalam dokumentasi Django: https://docs.djangoproject.com/en/stable/topics/ db/queries/#spanning-multi-valued-relationships
Query yang terhasil dijana oleh Django ialah:
SELECT "app_department"."name" FROM "app_department" LEFT OUTER JOIN "app_departmentvolunteer" ON ("app_department"."id" = "app_departmentvolunteer"."department_id") WHERE "app_departmentvolunteer"."id" IS NULL
Pendekatan ini menghapuskan keperluan untuk SQL mentah dan menyediakan pertanyaan yang lebih mudah dibaca dan diselenggara.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membuat Pertanyaan dengan Cekap untuk Jabatan Tanpa Sukarelawan Ditugaskan di Django Tanpa SQL Mentah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!