Django: Получение последнего значения по дате из связанной модели в html
Привет всем
У меня возник вопрос:
Итак, в обзоре родительского продукта я показываю название продукта и его URL, но есть также связанная модель с этой родительской моделью, которая хранит историю цен с течением времени.
Что я хочу сделать, это показать также последнюю цену в моей таблице, вот мой код:
models.py:
class Product(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=100, default=None, null=True, blank=True)
url = models.CharField(max_length=255, default=None, null=True, blank=True)
creation_date = models.DateTimeField(auto_now_add = True)
update_date = models.DateTimeField(auto_now = True)
class PriceHistory(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
product_info = models.ForeignKey(Product, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=20, decimal_places=2)
creation_date = models.DateTimeField(auto_now_add = True)
Мой views.py
@login_required
def overview(request):
all_products = PersonalisedTrackingInfo.objects.filter(user=request.user)
general_context = {'all_products': all_products}
return render(request, 'overview.html', general_context)
и мой html
<h4>Overview Products</h4>
<table>
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Url</th>
<th>Last price</th>
</tr>
</thead>
<tbody>
{% for product in all_products %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ product.name }}</td>
<td>{{ product.url }}</td>
<td>{{ product.id.price}}</td>
<td></td>
{% endfor %}
</tr>
</tbody>
</table>
Мой вопрос: как получить последнюю цену вместе с товаром в моем html обзоре? Я пробовал с {{ product.id.price}}. Я думаю, что я не далеко ушел, но не могу разобраться с этим.
Большое спасибо!
Вы можете получить самую последнюю историю цен, используя обратный аксессор, упорядочивая по дате создания и выбирая первый объект в наборе запросов:
latest_price_history = product.pricehistory_set.order_by('-creation_date').first()
Что касается того, как вы поместите это в ваш шаблон, вы можете добавить это как метод модели, например, так:
class Product(models.Model):
...
@property
def latest_price(self):
return self.pricehistory_set.order_by('-creation_date').first().price
Затем в своем шаблоне вы можете вызвать его следующим образом:
{{ product.latest_price }}