Как отфильтровать данные по активному пользователю в Django?
Я пытаюсь извлечь только последние данные для активного пользователя в мой шаблон Django. Однако в настоящее время я получаю следующую ошибку.
Поле 'id' ожидало число, но получило объект <django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor at 0x7f0682901a90>.
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_hub(request):
model = HealthStats
def get_queryset(self):
user = self.user
latest = HealthStats.objects.filter(user=user).latest('date')
return latest
context = {
"user": model.user,
"weight": model.weight,
"date": model.date,
"run_distance": model.run_distance,
"run_time": model.run_time,
"stats": HealthStats,
"latest": get_queryset(model)
}
return render(request, 'health_hub.html', context)
health_hub.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 Summary</h1>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row justify-content-center">
<h3>Welcome {{ latest.user }}!</h3>
<p>Please see below for your latest stats:</p>
<table class="table table-bordered">
<tr>
<td>Weight: {{ latest.weight }}</td>
<td>Run Distance: {{ latest.run_distance }} km</td>
</tr>
<tr>
<td>Run Time: {{ latest.run_time }}</td>
<td>Last Updated: {{ latest.date }}</td>
</tr>
</table>
Согласно сообщению об ошибке, похоже, что есть проблема с тем, что я пытаюсь протащить, но я не уверен, где именно, потому что я не запрашивал ID? Я просто пытаюсь отфильтровать данные в моих моделях, чтобы показать данные текущего пользователя, отсортированные по самому новому первому.
Любая помощь будет очень признательна!
Это ваш настоящий код? Вы смешиваете CBV и FBV, что странно... Ваша переменная model содержит класс, а не экземпляр. Я предполагал, что ваш контекст stats тоже плох, но я не нахожу, что вы хотите получить с помощью этой переменной
Попробуйте этот код для вашего представления:
def health_hub(request):
latest = HealthStats.objects.filter(user=request.user).latest('date')
context = {
"user": latest.user,
"weight": latest.weight,
"date": latest.date,
"run_distance": latest.run_distance,
"run_time": latest.run_time,
"stats": HealthStats,
"latest": latest
}
return render(request, 'health_hub.html', context)
Небольшая помощь по CBV с Django: https://docs.djangoproject.com/fr/3.2/topics/class-based-views/generic-display/