我正在尝试构建一个django应用程序,我可以随时跟踪产品价格。该应用程序定期获取新价格,绘制它们并显示最近的价格变化历史。
我每天检查一次价格并将价格加上日期时间戳保存到我的模型中。
models.py
Class Product(models.Model):
title = models.CharField(max_length=255)
Class Price(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
date_seen = models.DateTimeField(auto_now_add=True)
price = models.IntegerField(blank=True, null=True)
除了产品的当前价格,我还想在我收集的所有价格数据上显示最大和 min 。我希望获得该值以及该值的日期。到目前为止,我可以得到价值,但我无法得到相应的日期。我正在使用这个:
def price_hla(self):
return Product.objects.filter(price__product=self).aggregate(high_price=Max('price__price'), low_price=Min('price__price'), avg_price=Avg('price___price'))
有什么建议吗?提前谢谢!
编辑:根据回复,我有以下内容。我的问题是我的MAX价格与MAX日期相互独立。我希望MAX价格与最大价格的日期在同一响应中。
def price_hla(self):
return
Product.objects.filter(price__product=self)[:1].annotate(Max('price__price'), Max('price__date_seen'))`
答案 0 :(得分:0)
试试这个:
Product.objects.filter(price__product=self).annotate(
high_price=Max('price__price'),
).filter(price=F('max_price'))
哪个应该在结果对象中为您提供最高价格和日期。
我无法想出在同一查询中同时找到最低价格/日期的方法。我也有一种感觉,如果你有大量的物品,这将会非常缓慢。
答案 1 :(得分:0)
想出来,我得到了我想要的东西。如果有人读到这篇文章我会喜欢有关这是最佳做法的反馈,还是我的数据库会超载。
因为我需要实际价格和价格最高的日期,我需要返回整个价格对象。所以我通过覆盖默认的get_context_data
方法在我的DetailView上写了一些QuerySet。
views.py
class ProductDetailView(DetailView):
model = Product
def get_context_data(self, **kwargs):
context = super(ProductDetailView, self).get_context_data(**kwargs)
context['high'] = Price.objects.filter(product_id=self.get_object()).order_by('price').last()
context['low'] = Price.objects.filter(product_id=self.get_object()).order_by('-price').last()
context['avg'] = Price.objects.filter(product_id=self.get_object()).aggregate(avg_price=Avg('price'))
然后我使用high.price
和high.date_seen
等将其拉入我的模板。