집 >데이터 베이스 >MySQL 튜토리얼 >Django ORM Left Join을 사용하여 할당된 자원 봉사자가 없는 부서를 효율적으로 쿼리하려면 어떻게 해야 합니까?
Django ORM에 Left Join
복잡한 데이터베이스 관계를 처리할 때 데이터를 쿼리해야 하는 상황이 발생할 수 있습니다. 관련 기록의 유무. 이를 위한 한 가지 기술은 Left 조인으로 알려져 있습니다.
다음 모델이 있다고 가정합니다.
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)
할당된 자원 봉사자가 없는 모든 부서를 쿼리하려고 합니다. . 다음 원시 SQL 쿼리를 사용하면 이를 달성할 수 있습니다.
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;
Django에서는 조회에서 역방향 관계를 따라 왼쪽 조인 작업을 수행할 수 있습니다. 위의 원시 SQL 쿼리에 해당하는 Django는 다음과 같습니다.
qs = Department.objects.filter( departmentvolunteer__isnull=True).values_list('name', flat=True)
생성된 쿼리는 아래와 같이 원시 SQL 쿼리와 거의 동일합니다.
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
이 방법을 사용하면 Django ORM의 강력한 기능을 활용하면서 데이터를 효율적으로 쿼리하여 원시 SQL에 비해 더 Python적이고 유지 관리가 쉬운 접근 방식을 제공합니다.
위 내용은 Django ORM Left Join을 사용하여 할당된 자원 봉사자가 없는 부서를 효율적으로 쿼리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!