Django QuerySet按表达式排序

时间:2010-05-28 06:01:52

标签: django orm django-queryset

  

可能重复:
  django - ordering queryset by a calculated field

我如何使用order_by,如order_by('field1'*'field2') 例如,我有价格以不同货币列出的商品,所以订购商品 - 我必须进行货币转换。

class Currency(models.Model):
    code    = models.CharField(max_length=3, primary_key=True) 
    rateToUSD   = models.DecimalField(max_digits=20,decimal_places=10)

class Item(models.Model):
    priceRT     = models.DecimalField(max_digits=15, decimal_places=2, default=0)
    cur     = models.ForeignKey(Currency)

我希望有类似的东西:

Item.objects.all().order_by(F('priceRT')*F('cur__rateToUSD'))

但遗憾的是它不起作用,我也注意到了注释。 如何通过2个模型字段的值乘法结果来置换QuerySet排序。

2 个答案:

答案 0 :(得分:4)

使用extra()方法。特别是用于指定等式的select参数和用于排序的order_by参数。

答案 1 :(得分:2)

无聊方式:在Item类中添加一个名为priceUSD的额外字段,并使用重写保存方法填充它。意味着您没有在每个查询上运行计算的负担 - 仅在每次更新时。所以这是好还是不取决于你是否倾向于写更多或更多阅读(考虑到你的问题,也许它已被阅读?)

类似的东西:

class Item(models.Model):
    priceRT     = models.DecimalField(max_digits=15, decimal_places=2, default=0)
    cur     = models.ForeignKey(Currency)
    priceUSD = models.DecimalField(max_digits=15, decimal_places=2, default=0)

    def save(self,*args,**kwargs)
        self.priceUSD = self.priceRT * self.cur.rateToUSD
        super(Model,self).save(*args,**kwargs)

在我的django中,每当我尝试实现聪明的计算字段而不将它们存储在数据库中时,我通常会发现它有太多的缺点而无法使用(例如可以'对它们进行查询,无法对它们进行排序)。所以我通常使用自定义保存方法在DB中存储适当的字段,这样就可以了。你会想要更多的错误检查和东西。