Как ограничить количество ответов в цикле for до 3 в Django Templates?

В моем текущем шаблоне Django у меня есть две используемые модели, которые определены в моем views.py как:

'tasks' : IndividualTask.objects.all(),
'updates' : TaskUpdate.objects.all(),

Я настроил сигналы таким образом, что когда происходит обновление задачи, создается обновление.

В настоящее время я перебираю все задачи, затем все их обновления и извлекаю соответствующие обновления для каждой задачи, как показано ниже.

{% for task in tasks %}
{% for update in updates %} 
    {% if task.id == update.task.id %}
        {{ update.update }}
    {% endif %}
{% endfor %} 
{% endfor %} 

Однако я хотел бы ограничить количество обновлений, которые я показываю, до трех.

Я пробовал использовать slice, показано ниже, но это ограничивает все обновления до 3 лучших из всех обновлений, а не до 3 лучших из обновлений каждой отдельной задачи.

{% for task in tasks %}
{% for update in updates|slice:":3" %} 
    {% if task.id == update.task.id %}
        {{ update.update }}
    {% endif %}
{% endfor %} 
{% endfor %}

Models.py имеет следующий вид:


class IndividualTask(models.Model):
    task = models.CharField( 
        max_length = 256,
        blank=False,
        null=True,
        )

    task_description = models.CharField(
        max_length = 256,
        blank=False,
        null=True,
        )

    expected_completion = models.DateField(
        max_length = 64,
        null=True,
        )

    goal = models.ForeignKey(
        IndividualGoal,
        on_delete=models.CASCADE,
        related_name="goals",
        blank=False,
        null=True,
    )

    creator = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="creator",
        blank=False,
        null=True,
    )

    owner = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        blank=False,
        null=True,
    )


    status_choices = [
        ("", "Select Current Status"),
        ("Preparation", "Preparation"),
        ("Review", "Review"),
        ("Update", "Update"),
        ("Finalised", "Finalised"),
    ]

    current_status = models.CharField(
        max_length=32,
        choices = status_choices,
        default = "Select current status",
    )

    created = models.DateField(
        auto_now_add = True,
    )

    def __str__(self):
        return f"{self.task}"

class TaskUpdate(models.Model):
    update = models.CharField(
        max_length = 5000,
    )

    task = models.ForeignKey(
        IndividualTask,
        on_delete=models.CASCADE,
        null = True,
    )

    update_created = models.DateField(
        auto_now_add = True,
    )

    update_time_created = models.TimeField(
        auto_now_add = True,
    )

    author = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="update_author",
        blank=True,
        null=True,
    )

    update_choices = [
        ("New Task", "New Task"),
        ("New Commentary", "New Commentary"),
    ]

    update_status = models.CharField(
        max_length=32,
        choices = update_choices,
        null = True,
    )

    class Meta:
        ordering = ["-update_created", "-update_time_created"]

Я буду благодарен за любой совет о том, как я могу ограничить количество обновлений, показанных для каждой задачи, до 3, пожалуйста?

РЕДАКТИРОВАНИЕ:

Полный отслеживание показано ниже:

В контексте можно передать IndividualTasks с TaskUpdates, упорядоченными по убыванию с помощью Prefetch объекта [Django-doc]:

from django.db.models import Prefetch

context = {
    'tasks' : IndividualTask.objects.prefetch_related(
                  Prefetch('taskupdate_set', TaskUpdate.objects.order_by('-update_created', '-update_time_created'))
              )
}

тогда в шаблоне вы перечисляете taskupdate_set:

{% for task in tasks %}
    {% for update in task.taskupdate_set.all|slice:":3" %} 
        {{ update.update }}
    {% endfor %}
{%endfor %}

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Вернуться на верх