2011-01-11 5 views
0

J'ai une simple relation un à plusieurs (models.ForeignKey) entre deux de mes classes de modèle:Quering valeurs distinctes throught modèles liés

class TeacherAssignment(models.Model): 
    # ... some fields 
    year = models.CharField(max_length=4) 

class LessonPlan(models.Model): 
    teacher_assignment = models.ForeignKey(TeacherAssignment) 
    # ... other fields 

Je voudrais interroger ma base de données pour obtenir l'ensemble des années distinctes de TeacherAssignments liées à au moins un LessonPlan. Je suis en mesure d'obtenir cet ensemble en utilisant l'API de requête Django si j'ignore la relation à LessonPlan:

class TeacherAssignment(models.Model): 
    # ... model's fields 
    def get_years(self): 
     year_values = self.objects.all().values_list('year').distinct().order_by('-year') 
     return [yv[0] for yv in year_values if len(yv[0]) == 4] 

Malheureusement, je ne sais pas comment exprimer la condition que le TeacherAssignment doit être lié à au moins un LessonPlan. Des idées comment je serais en mesure d'écrire la requête?

Merci d'avance.

Répondre

1

Il est recommandé d'utiliser le ModelManager pour ORM-niveau de la table comme suit:

class TeacherAssignmentManager(models.Manager): 
    def get_years(self): 
     year_values = self.filter(lessonplan__isnull=False).\ 
         values_list('year').distinct().\ 
         order_by('-year') 
     return [yv[0] for yv in year_values if len(yv[0]) == 4] 

Ajoutez votre modèle de gestionnaire personnalisé à la classe modèle TeacherAssignment

objects = TeacherAssignmentManager() 

Maintenant, vous pouvez utiliser TeacherAssignment.objects.get_years() pour récupérer toutes les années distinctes qui sont liées à au moins un LessonPlan.

+0

merci! J'ai été capable d'écrire la bonne requête avant de lire votre réponse mais la suggestion de ModelManager est très bonne! –

0

TeacherAssignment.objects.filter(lessonplan__isnull=False)

votre requête. Répond Obtenez tous les TeacherAssignments qui ont un LessonPlan.

Les relations inverses peuvent être interrogées de cette manière à partir du modèle parent.