Maison > base de données > tutoriel mysql > Comment puis-je rechercher efficacement des départements sans bénévoles assignés à l'aide des jointures gauches Django ORM ?

Comment puis-je rechercher efficacement des départements sans bénévoles assignés à l'aide des jointures gauches Django ORM ?

Linda Hamilton
Libérer: 2024-12-28 06:26:11
original
761 Les gens l'ont consulté

How Can I Efficiently Query for Departments Without Assigned Volunteers Using Django ORM Left Joins?

Rejoindre à gauche dans les ORM Django

Lorsque vous traitez des relations de bases de données complexes, des situations peuvent survenir dans lesquelles vous devez interroger des données tout en prenant en compte les présence ou absence de documents connexes. Une technique pour ce faire est connue sous le nom de jointure à gauche.

Supposons que vous ayez les modèles suivants :

class Volunteer(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)    
    email = models.CharField(max_length=50)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)


class Department(models.Model):
    name = models.CharField(max_length=50, unique=True)
    overseer = models.ForeignKey(Volunteer, blank=True, null=True)
    location = models.CharField(max_length=100, null=True)


class DepartmentVolunteer(models.Model):
    volunteer = models.ForeignKey(Volunteer)
    department = models.ForeignKey(Department)
    assistant = models.BooleanField(default=False)
    keyman = models.BooleanField(default=False)
    captain = models.BooleanField(default=False)
    location = models.CharField(max_length=100, blank=True, null=True)
Copier après la connexion

Vous souhaitez interroger tous les services auxquels aucun bénévole n'est affecté. . La requête SQL brute suivante permettrait d'obtenir cela :

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

Dans Django, vous pouvez effectuer une opération de jointure gauche en suivant la relation vers l'arrière dans la recherche. Voici l'équivalent Django de la requête SQL brute ci-dessus :

qs = Department.objects.filter(
    departmentvolunteer__isnull=True).values_list('name', flat=True)
Copier après la connexion

La requête générée sera presque identique à la requête SQL brute, comme indiqué ci-dessous :

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

Cette méthode vous permet pour interroger les données efficacement tout en tirant parti de la puissance des ORM Django, offrant une approche plus pythonique et maintenable par rapport au SQL brut.

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