Django ORM模型属性VS选择额外哪个更好

时间:2014-09-11 07:17:20

标签: python django django-orm

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

Size = order_size_weight x requested_selling_price

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

1。型号属性

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

2。修改QuerySet

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. 的最佳/快速方法是什么?
  3. 使用extra select
  4. 后我可以使用注释吗?

    修改

    2的解决方案。

    我能够在使用注释之前使用select extra来解决第二个问题,这有助于解决问题。

1 个答案:

答案 0 :(得分:0)

虽然对于计算字段仍然可以同时执行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)