Django: получить родительские объекты, соответствующие условию потомка - PullRequest
1 голос
/ 08 января 2010

Не могу придумать более подходящее название вопроса, но я ищу несколько советов о том, как реализовать следующее требование:

У меня есть класс 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 Ответ

3 голосов
/ 08 января 2010

Чтобы получить список задач, которые назначены пользователю, я бы сделал что-то вроде этого:

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

Возможно, вам придется настроить некоторые детали для вашей реализации, но вы поняли идею, на которую я надеюсь.

...