2009-08-23 6 views
2

J'ai deux ou trois modèles de Django mis en place comme ceci:Comment sélectionner tous les objets non référencés dans plusieurs-à-plusieurs

class Group(models.model): 
    name = models.CharField(max_length=50, unique=True) 

class Section(models.Model): 
    name = models.CharField(max_length=50, unique=True) 
    slug = models.SlugField(help_text='Auto generated') 
    groups = models.ManyToManyField(Group, blank=True) 

Dans une partie de mon code, je dois obtenir toutes les Section objets où le champ groupes est vide, je peux l'exprimer en utilisant le SQL brut mais j'aimerais vraiment utiliser le code ORM si possible. Une façon d'écrire la requête dans SQL est:

select * from section where id not in (select section_id from section_groups); 

Est-il possible d'exprimer cette exigence dans une requête ORM?

Répondre

4

Bien que le SQL généré est légèrement différent de l'échantillon que vous espérez:

Section.objects.filter(groups__isnull=True) 

obtiendrait le travail.

Cela génère les éléments suivants (formatage ajouté)

SELECT 
    "app_section"."id", 
    "app_section"."name", 
    "app_section"."slug" 
    FROM "app_section" 
    LEFT OUTER JOIN "app_section_groups" ON 
     ("app_section"."id" = "app_section_groups"."section_id") 
    WHERE "app_section_groups"."group_id" IS NULL 
2

Juste une supposition, mais perhapse

Section.objects.filter(groups__isnull=True) 
+0

OK, je suis gêné! Je ne peux pas croire que j'ai raté ça. Merci. – artran

Questions connexes