Django:获取子对象的父对象匹配条件

时间:2010-01-08 02:54:34

标签: django django-templates django-queryset

无法想出更合适的问题标题,但我正在寻求有关如何实施以下要求的一些建议:

我有一个Project类,可能包含Task个对象。任务有受让人。在我的Django模板中,我想为给定用户呈现项目和任务的“树”,仅显示那些至少有一个任务分配给用户的项目,并且在每个项目中,只显示分配给该用户的任务。用户。

我最初的方法是首先找到至少有一个已分配任务的项目:

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

(不是最有效的方法,但我只处理少数项目和任务。)

然后我想我可以在Project上编写一个方法来只检索分配给用户的那些任务:

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

或类似的东西。

但是,我无法直接从模板中调用该方法。所以,我的问题是:有没有更好的方法来实现这一目标?寻找有关QuerySet和模板实现的建议。

(我的另一个想法是将分配的任务固定到list_assigned_tasks中的每个项目实例上 - 这是一种有效的方法吗?)

1 个答案:

答案 0 :(得分:3)

要获取分配给用户的任务列表,我会按照以下几点做一些事情:

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

然后在模板中:

{% 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 %}

您可能需要针对您的实施调整一些细节,但您会得到我希望的想法。