Maison >base de données >tutoriel mysql >Comment trouver efficacement des départements sans bénévoles à l'aide de l'ORM de Django ?

Comment trouver efficacement des départements sans bénévoles à l'aide de l'ORM de Django ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-30 16:11:12503parcourir

How to Efficiently Find Departments Without Volunteers Using Django's ORM?

LEFT JOIN dans Django ORM

L'opération de jointure à gauche est couramment utilisée pour récupérer des données de plusieurs tables en combinant des lignes avec des colonnes correspondantes. Dans Django, vous pouvez y parvenir en utilisant les méthodes filter() et values_list().

Considérez le scénario suivant : vous disposez de trois modèles : Volunteer, Department et DepartmentVolunteer. Un bénévole peut appartenir à plusieurs départements et un département peut avoir plusieurs bénévoles. Vous souhaitez récupérer tous les départements auxquels aucun bénévole n'est affecté.

Une façon d'y parvenir consiste à utiliser une requête SQL brute :

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;

Cependant, Django fournit une approche plus élégante et Manière pythonique d'effectuer cette opération en suivant les étapes suivantes :

  1. Utilisez la méthode filter() pour spécifier la condition.
  2. Utilisez le Values_list() pour récupérer les valeurs de colonne souhaitées.

Le code suivant illustre cette approche :

qs = Department.objects.filter(
    departmentvolunteer__isnull=True).values_list('name', flat=True)
print(qs.query)

Cette requête génère le SQL suivant :

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

qui renvoie les noms des départements auxquels aucun bénévole n'est affecté.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn