Django ORM での左結合
複雑なデータベース関係を扱う場合、関連レコードの有無。これを行う手法の 1 つは、左結合として知られています。
次のモデルがあるとします。
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 中国語 Web サイトの他の関連記事を参照してください。