django产品价格跟踪器:获取所有时间最大和最小价格的金额和日期

时间:2017-10-26 02:32:38

标签: python django

我正在尝试构建一个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'))`

2 个答案:

答案 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.pricehigh.date_seen等将其拉入我的模板。