django order_by值未存储在数据库中

时间:2011-05-12 01:39:02

标签: python django django-models performance

我有一个模型,Rating,看起来像这样:

class Rating(models.Model):
    upvotes = models.IntegerField(default=0)
    downvotes = models.IntegerField(default=0)
    @property
    def total(self):
        return self.upvotes - self.downvotes

我有一组评级,我需要通过他们的total属性订购。如您所见,存储在数据库中的值。 rating_set.order_by("total")不起作用。

我可以使用sorted在评分列表中使用Python的key=lambda r: r.total函数。但在我看来,这将是相当低效的,并且可能存在一种更好的方式来自Django。

Django是否支持派生值排序?我会通过将总值存储在数据库中来提高性能吗?

1 个答案:

答案 0 :(得分:1)

这是因为数据库不知道total属性。它只存在于python中。您可以使用extra复制相同的行为,以便按数据库计算和排序。像这样:

Rating.objects.extra(select={'total': "upvotes - downvotes"}).order_by('-total')