Почему я не могу отобразить данные, отфильтрованные для активного пользователя?

Я пытаюсь отобразить в своей таблице только данные для вошедшего в систему пользователя. Я могу отобразить все данные с помощью objects.all(), но когда я фильтрую данные по активному пользователю, это не работает. Я пробовал изменить контекст, чтобы ссылаться на набор запросов в целом, но получаю ошибку, говорящую, что я не могу выполнить get на кортеже.

Если у меня есть контекст как есть, я получаю ошибку 'Объект QuerySet не имеет атрибута 'user'

Models.py:

class HealthStats(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateField(auto_now=True)
    weight = models.DecimalField(max_digits=5, decimal_places=2)
    run_distance = models.IntegerField(default=5)
    run_time = models.TimeField()

    class Meta:
        db_table = 'health_stats'
        ordering = ['-date']

    def __str__(self):
        return f"{self.user} | {self.date}"

Views.py:

def health_history(request):
    queryset = HealthStats.objects.filter(user=request.user).values()
    print(queryset)
    print(type(queryset))
    context = {
            "user": queryset.user_id,
            "weight": queryset.weight,
            "date": queryset.date,
            "run_distance": queryset.run_distance,
            "run_time": queryset.run_time,
        }

    return (request, 'health_hub_history.html', context)

health_hub_history.html:

{% extends 'base.html' %}
{% load static %}

{% block content %}
<div class="container-fluid">
    <div class="row">
        <div class="col-sm-12 text-center">
            <h1>My Health History</h1>
        </div>
    </div>
</div>
<div class="container-fluid">
    <div class="row justify-content-center">
        <div class="col-auto text-center p-3">
            <table class="table table-striped table-hover table-bordered">
                <tr>
                    <td>User:</td>
                    <td>Weight (lbs):</td>
                    <td>Date:</td>
                    <td>Run Distance (km):</td>
                    <td>Run Time (HH:MM:SS):</td>
                </tr>
                {% for stat in queryset %}
                <tr>
                    <td>{{ stat.user }}</td>
                    <td>{{ stat.weight }} </td>
                    <td>{{ stat.date }}</td>
                    <td>{{ stat.run_distance }}</td>
                    <td>{{ stat.run_time }}</td>
                </tr>
                {% endfor %}
            </table>
        </div>
    </div>
</div>
{% endblock content %}

Не обращайте внимания на операторы печати - просто пытаюсь разобраться в проблеме, и удалю их, когда она будет решена. Также знайте, что .values() в конце объявления queryset, вероятно, неверно - оно там по тем же причинам.

Я хожу по кругу уже несколько часов, поэтому любая помощь будет оценена по достоинству!

HealthStats.objects.filter(user=request.user).values()

Приведенный выше код дает вам объект QuerySet, а не объект HealthStats. Поскольку User является ForeignKey из HealthStats, это означает, что каждый объект User может иметь любое количество объектов HealthStats, связанных с ним (он может иметь 0, 1, 2 или более статистик). Это означает, что функция health_history должна давать вашему фронт-энду список объектов HealthStats.

def health_history(request):
    serialized_stats = []
    # `filter` also returns a `QuerySet` object which is already iterable. 
    for stats in HealthStats.objects.filter(user=request.user):
        serialized_stats.append({
            "user": stats.user_id,
            "weight": stats.weight,
            "date": stats.date,
            "run_distance": stats.run_distance,
            "run_time": stats.run_time,
        })
    context = {
        "stats": serialized_stats
    }

    return (request, 'health_hub_history.html', context)

Вероятно, вам также потребуется изменить логику html, чтобы правильно обработать это.

Это из-за вашего оператора возврата. Попробуйте следующее:

return (request, 'health_hub_history.html', {'queryset': queryset})
Вернуться на верх