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
Libérer: 2024-12-30 16:11:12
original
477 Les gens l'ont consulté

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;
Copier après la connexion

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)
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal