Maison >base de données >tutoriel mysql >Comment puis-je rechercher efficacement des départements sans volontaires affectés dans Django sans SQL brut ?

Comment puis-je rechercher efficacement des départements sans volontaires affectés dans Django sans SQL brut ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-02 19:16:44907parcourir

How Can I Efficiently Query for Departments with No Assigned Volunteers in Django Without Raw SQL?

LEFT JOIN Django ORM : une alternative aux requêtes SQL brutes

Question :

Considérez les modèles suivants :

class Volunteer(models.Model):
    ...

class Department(models.Model):
    ...

class DepartmentVolunteer(models.Model):
    ...

Pour interroger tous les départements sans attribué volontaires, on peut utiliser l'instruction SQL suivante :

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;

Existe-t-il une manière plus proche de celle de Django d'effectuer cette requête, ou faut-il s'en tenir au SQL brut ?

Réponse :

Django fournit une manière plus concise et expressive d'effectuer la même requête en utilisant le filtre() method :

qs = Department.objects.filter(
    departmentvolunteer__isnull=True).values_list('name', flat=True)

Cette requête couvre la relation à valeurs multiples entre Department et DepartmentVolunteer, comme décrit dans la documentation Django : https://docs.djangoproject.com/en/stable/topics/db/queries /#spanning-multi-valued-relationships

La requête résultante générée par Django 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 approche élimine le besoin de SQL brut et fournit une requête plus lisible et maintenable.

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