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

Posted

技术标签:

【中文标题】Django:获取子对象匹配条件的父对象【英文标题】:Django: get parent objects matching condition on child 【发布时间】:2011-01-02 18:25:44 【问题描述】:

想不出更合适的问题标题,但我正在寻找有关如何实现以下要求的建议:

我有一个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】:

要获取分配给用户的任务列表,我会按照以下方式进行操作:

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 %

你可能需要为你的实现调整一些细节,但你明白我希望的想法。

【讨论】:

啊,太好了。我不知道regroup - 看起来就是这样,谢谢。

以上是关于Django:获取子对象匹配条件的父对象的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Data 中的父对象不获取子对象

Django - 有啥方法可以立即获取外键对象?

Symfony:从formevent获取子对象中的父对象

如何获取Django中子模型中存在外键的父模型的所有对象?

在 Django 的父管理视图中将子对象链接到父对象

Django 无法保存子对象的父 ID