2009-12-05 8 views
3
class Project(models.Model): 
    title = models.CharField() 

class Job(models.Model): 
    name = models.CharField() 
    user = models.ForeignKey(User) 
    project = models.ForeignKey(Project) 

J'ai beaucoup de travaux pour chaque projet. Comment obtenir une liste de tous les utilisateurs de tous les travaux d'un projet?
je suis venu avec ceci:Django: Accéder au modèle via un autre modèle

users = set() 
for job in project.job_set.all(): 
    users.add(job.user) 

est-il un moyen plus facile sans boucle à travers tous les emplois explicitement?

+0

Vous pouvez également ha a écrit 'users = set (job.user pour job dans project.job_set.all())' –

Répondre

4

Utilisez Django's join syntax et commencer à partir de votre modèle User à la place:

users = User.objects.filter(job_set__project=project).distinct() 
+0

cette ligne ne semble pas fonctionner - dit Impossible de résoudre le mot clé 'job_set' en champ. Les choix sont les suivants: – barin

+0

J'ai pensé qu'au lieu de job_set il devrait y avoir du travail. Merci, ça marche! – barin

+0

Basé sur le code dans votre question, puisque vous n'avez pas spécifié un 'related_name' dans le' ForeignKey', il devrait avoir par défaut 'job_set'. Si vous faites cela à la place: 'user = models.ForeignKey (User, related_name = 'jobs')', alors vous filtreriez basé sur 'jobs__project = project' –

1

Sinon, vous pouvez utiliser une relation ManyToMany du projet à l'utilisateur à travers le modèle d'emploi qui est en effet un modèle rejoindre:

class Project(models.Model): 
    users = models.ManyToManyField(User, through='Job') 
    ... 

Et puis simplement:

project.users.all() 
Questions connexes