LEFT JOIN Django ORM : une alternative aux requêtes SQL brutes
Question :
Considérez les modèles suivants :
class Volunteer(models.Model): ... class Department(models.Model): ... class DepartmentVolunteer(models.Model): ...
Pour interroger tous les départements sans attribué volontaires, on peut utiliser l'instruction SQL suivante :
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;
Existe-t-il une manière plus proche de celle de Django d'effectuer cette requête, ou faut-il s'en tenir au SQL brut ?
Réponse :
Django fournit une manière plus concise et expressive d'effectuer la même requête en utilisant le filtre() method :
qs = Department.objects.filter( departmentvolunteer__isnull=True).values_list('name', flat=True)
Cette requête couvre la relation à valeurs multiples entre Department et DepartmentVolunteer, comme décrit dans la documentation Django : https://docs.djangoproject.com/en/stable/topics/db/queries /#spanning-multi-valued-relationships
La requête résultante générée par Django est :
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
Cette approche élimine le besoin de SQL brut et fournit une requête plus lisible et maintenable.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!