我需要通过django中的表达式计算和排序。最有效的方法是什么?
示例设置:
class Rating(models.Model):
rating = models.IntegerField(...)
prev = models.ForeignKey('Rating')
我必须通过它来计算当前评级与之前和订单的差异。我有一些方法可行。
方法1:使用extra()
添加计算差异的额外select子句。但是这取决于Django标记在SQL查询中连接表的方式。例如:
Rating.objects.filter(prev__isnull=False)\
.select_related('prev')\
.extra(select={'diff': 'rating.rating - T3.rating'})\
.order_by('-diff')
(在我的情况下,连接表的名称为T3
,因为我的模型中实际上有第二个相关字段)
方法2:在模型中添加额外字段。
方法3:在python中进行排序。非常低效。
我想要什么:能够在额外F
子句中使用select
表达式,如下所示:
Rating.objects.filter(prev__isnull=False)\
.extra(select={'diff': F('rating') - F('prev__rating')})\
.order_by('-diff')
或可能在order by
子句中:
Rating.objects.filter(prev__isnull=False)\
.order_by(F('rating') - F('prev__rating'))
对于Django开发者来说,这可能是一个更好的问题,但我希望看到你有什么想法。