【问题标题】:django product price tracker: getting the amount and date of the all time max and min pricedjango 产品价格跟踪器:获取所有时间最高和最低价格的金额和日期
【发布时间】:2017-10-26 02:32:38
【问题描述】:

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

除了产品的当前价格,我还想显示我收集的所有价格数据的最高最低。我想获取该值以及该值的日期。到目前为止,我可以获得价值,但我无法获得相应的日期。我正在使用这个:

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'))`

【问题讨论】:

  • 这个这个一模一样?他们似乎正在尝试在没有表连接的情况下找到特定产品的最大值和日期。
  • 同样的逻辑适用,无论是否存在表连接。你只有一个外键而不是一个整数。
  • 嗯,好的。我用我现在拥有的东西编辑了我的原始帖子,但我的问题是我得到了彼此独立的 MAX 价格和 MAX 日期。我希望 MAX 价格与该最高价格的日期在同一响应中。

标签: python django


【解决方案1】:

试试这个:

Product.objects.filter(price__product=self).annotate(
        high_price=Max('price__price'), 
    ).filter(price=F('max_price'))

这应该为您提供结果对象中的最高价格和日期。

不过,我想不出一种方法可以在同一个查询中同时找到最低价格/日期。我也有一种感觉,如果你有大量的项目,这会很慢。

【讨论】:

    【解决方案2】:

    想通了,我得到了我想要的。如果有人读到这篇文章,我希望得到反馈,了解这是否是最佳做法,或者我是否会超载我的数据库。

    因为我需要实际价格和最高价格日期,所以我需要返回整个价格对象。所以我通过覆盖默认的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 等将其拉入我的模板中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2016-01-26
      • 2017-12-05
      • 1970-01-01
      相关资源
      最近更新 更多