2010-01-08 4 views
1

N'a pas pu penser à un titre de la question plus appropriée, mais je suis à la recherche de quelques conseils sur la façon de mettre en œuvre l'exigence suivante:Django: obtenir des objets parents état correspondant à l'enfant

J'ai une classe Project, qui peut contenir Task objets. Les tâches ont un cessionnaire. Dans mon modèle Django, je souhaite afficher un «arbre» ​​de projets et de tâches pour un utilisateur donné, en ne montrant que les projets qui ont au moins une tâche assignée à l'utilisateur, et au sein de chaque projet, uniquement les tâches affectées au utilisateur.

Mon approche initiale était d'abord de trouver des projets avec au moins une tâche assignée:

def list_assigned_tasks(request, assignee_id): 
    projects = Project.objects.filter(task__assignee=assignee_id).distinct() 
    # ... 

(pas l'approche la plus efficace, mais je ne traitant qu'avec un petit nombre de projets & tâches.)

Je pensais que je pourrais écrire une méthode sur Project pour récupérer uniquement les tâches assignées à un utilisateur:

class Project(models.Model): 
    # ... 
    def assigned_tasks(self, assignee_id): 
     return self.task_set.filter(assignee=assignee_id) 

ou quelque chose comme ça.

Cependant, je ne serais pas capable d'appeler cette méthode directement à partir d'un modèle. Donc, ma question est la suivante: y a-t-il un meilleur moyen d'y parvenir? Vous recherchez des conseils sur l'implémentation de QuerySet et de modèle.

(Mon autre pensée était de verrouiller simplement les tâches assignées une sur l'instance de projet list_assigned_tasks - est une approche valable?)

Répondre

3

Pour obtenir une liste des tâches qui lui sont assignées à un utilisateur, je ferais quelque chose le long de ces lignes:

assignee = get_object_or_404(Person, pk=assignee_id) 
tasks = assignee.task_set.select_related('project').order_by('project') 

Ensuite, dans le modèle:

{% regroup tasks by project as project_list %} 
{% for pgroup in project_list %} 
    <h3>{{ pgroup.grouper }}</h3> 
    <ul> 
    {% for task in pgroup.list %} 
     <li>{{ task }}</li> 
    {% endfor %} 
    </ul> 
{% endfor %} 

vous pourriez avoir à ajuster quelques détails pour l'implémentation, mais vous obtenez l'idée J'espère.

+0

Ah, excellent. Je n'étais pas au courant de «regrouper» - cela ressemble à la chose, merci. – harto