【问题标题】:Django ORM Model Property VS Select Extra Which is betterDjango ORM 模型属性 VS Select Extra 哪个更好
【发布时间】:2014-11-05 01:04:01
【问题描述】:

我通过将两个字段相乘来计算项目的size

Size = order_size_weight x requested_selling_price

我有两种方法可以做到这一点。

1。模型属性

return float(self.order_size_weight) * float(self.requested_selling_price)

2。修改查询集

return self.extra(
                select={"priority": "COALESCE(bm_rank, sales_rank, id)",
        "size": "order_size_weight*requested_selling_price",  # for oder_by size.

})

问题

当我使用second 方法时,我不能使用Annotate 来聚合或获取所有大小的总和。

问题

  1. calculate Size 的最佳/快速方法是什么?
  2. 我可以在使用extra select后使用Annotate吗?

编辑

2 的解。

我可以通过在使用注释之前使用select extra 来解决第二个问题,这将有助于解决问题。

【问题讨论】:

  • Here 是一个相关问题
  • 我建议您编辑标题以更好地匹配问题 - 现在它非常通用,并没有暗示任何可能相关的事实:COALESCE、选择额外等。
  • 你刚刚对这个标题投了反对票吗?不过我已经更新了。

标签: python django django-orm


【解决方案1】:

虽然对于计算字段应该仍然可以同时使用 annotateaggregate,但如果您还想对它进行排序(并且没有计算的索引),则在数据库性能方面不建议这样做结果)。

对于这样的情况,我建议使用enter link description here(或类似的东西)。您可以使用回调函数将结果存储在数据库中:http://initcrash.github.io/django-denorm/tutorial.html#creating-denormalized-fields-using-callback-functions

class SomeModel(models.Model):
    order_size_weight = models.IntegerField()
    requested_selling_price = models.IntegerField()

    @denormalized(models.IntegerField)
    def calculate_size(self):
        return float(self.order_size_weight) * float(self.requested_selling_price)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 2011-10-06
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2016-10-08
    • 1970-01-01
    相关资源
    最近更新 更多