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!