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
Linda Hamiltonoriginal
2024-12-28 06:26:11756parcourir

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)

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;

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)

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

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!

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