Dans Django, vous pouvez exécuter avec élégance des opérations LEFT JOIN pour récupérer des données spécifiques. Explorons comment utiliser cette technique pour identifier les départements sans bénévoles assignés.
Étant donné 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)
Nous pouvons tirer parti de Django ORM REJOIGNEZ À GAUCHE pour obtenir des départements sans bénévoles associés :
qs = Department.objects.filter(departmentvolunteer__isnull=True).values_list('name', flat=True)
La requête générée est :
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 requête récupère les noms de département là où il n'y a aucune entrée dans la table DepartmentVolunteer.
Django ORM prend en charge les « relations multi-valeurs » via le filtrage, ce qui permet une traversée efficace de relations complexes.
La documentation sur ce sujet peut être trouvée ici : https://docs.djangoproject.com/en/stable/topics/db/queries/#spanning-multi-valued-relationships
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!