【问题标题】:How to make calculation of fields from different Django Models? (JOIN)如何计算来自不同 Django 模型的字段? (加入)
【发布时间】:2022-01-18 20:53:08
【问题描述】:

现在有三个表:

class Product(models.Model):
    sku = models.CharField(max_length=200, unique=True)
    name = models.CharField(max_length=200, null=True)

class HistoricalData(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    date = models.DateTimeField()
    demand_sold = models.IntegerField(default=0)

class ForecastData(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    date = models.DateTimeField()
    demand_sold = models.IntegerField(default=0)

我需要比较产品列表的历史数据和预测数据并计算准确率。公式如:ForecastData.demand_sold * 100/HistoricalData.demand_sold 目前的解决方案是遍历历史和预测数据集并为demand_sold进行计算

products = Product.objects.filter(...)
queryset_hist = HistoricalData.objects.filter(product__in=products)
queryset_forecast = ForecastData.objects.filter(product__in=products)

我想知道是否有任何优雅的解决方案来计算来自不同 Django 模型的字段。 (例如加入?)

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    你有没有尝试过这样的事情:

    products = Product.objects.all()
    for p in products:  # p is an object of class Product
        one_historical_record = HistoricalData.objects.filter(product=p)
        one_forecast_record = ForecastData.objects.filter(product=p)
        forecast_for_product_p = one_forecast_record.demand_sold * 100/one_historical_record.demand_sold
    

    这就是你要找的吗?

    【讨论】:

    • 是的,目前,这是我的解决方案。问题是我有数千种产品。在您附加的示例中,Django 将在每次迭代时查询数据库。我想减少对数据库的查询。所以我正在寻找如何优化我的解决方案并在数据库端进行计算。
    • 您可能可以使用annotate 然后:products = Products.objects.filter(...).annotate(forecast=F('related_name_forecast__demand_sold') * 100/F('related_name_historical__demand_sold')) 我认为您需要做的就是使用related_name 字段更新HistoricalData 和ForeignKey 字段,以使反向查询更容易。喜欢:class ForecastData(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="forecast_product")(我不是 100% 了解通过 ForeignKey 拉出 demand_sold 的语法)
    • 它仍然需要遍历整个产品列表,这是不行的。我相信有一个选项以某种方式加入/合并两个表,并在 DB 的帮助下进行计算
    猜你喜欢
    • 2020-08-06
    • 2013-07-14
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多