2009-11-12 4 views
3

J'ai un problème lors de la création de requêtes "exclude" sur des tables qui ont une relation many-to-many via une troisième table. J'ai une table avec des projets, une table avec des gens et une table relationsship avec les drapeaux « is_green, is_yellow, is_red », comme:Exclure une relation many-to-many via une troisième table

class Project(models.Model): 
    ... 

class Person(models.Model): 
    projects = models.ManyToManyField(Project, through='Status') 

class Status(models.Model): 
    person = models.ForeignKey(Person) 
    project = models.ForeignKey(Project) 
    is_green = models.BooleanField() 
    ... 

Maintenant, je veux faire une requête qui renvoie toutes les personnes, l'exclusion de ceux qui font avoir le drapeau "is_red" dans un projet spécifique. Mais le

Person.objects.exclude(project=p, status__is_red=True) 

suivant exclut tous ceux qui sont inscrits au projet p mais a le statut = rouge pour tout projet il est inscrit. Y at-il un moyen d'attacher la deuxième condition à la première?

Mon approche était de filtrer directement sur la table d'état, ce qui fonctionne bien sûr. Mais alors j'ai une liste d'objets "Statut" au lieu d'objets "Personne".

Répondre

4

Peut-être que cela? (non testé)

Person.objects.exclude(id__in=Person.objects.filter(project=p, status__is_red=True).values(id)) 
+1

Super! Cette idée fonctionne comme souhaité. Bien que la syntaxe doive être légèrement modifiée, car values ​​() donne une liste de dicts (au moins dans v1.0). Cela donne le résultat exact: Person.objects.exclude (id__in = Person.objects.filter (projet = p, statut__is_red = Vrai) .values_list ('id', flat = true)) – Daniel

+0

Ah, oui ... Vous êtes juste sur l'utilisation de values_list. Je suis désolé. :-) – cethegeek

0

Si vous avez une liste d'objets d'état appelés « objets », vous pouvez utiliser

[s.person for s in objects] 

pour en faire une liste des personnes correspondantes.

+0

Merci pour votre réponse. Mais c'est exactement ce que je veux éviter. La question est, s'il y a une possibilité obtenir la liste des personnes dans une déclaration. – Daniel

Questions connexes