我如何使用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排序。
答案 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中存储适当的字段,这样就可以了。你会想要更多的错误检查和东西。