Django:在extra或order_by中的相关字段上使用表达式

时间:2014-03-21 16:16:06

标签: python django

我需要通过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开发者来说,这可能是一个更好的问题,但我希望看到你有什么想法。

0 个答案:

没有答案