我有一个模型,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是否支持派生值排序?我会通过将总值存储在数据库中来提高性能吗?
答案 0 :(得分:1)
这是因为数据库不知道total
属性。它只存在于python中。您可以使用extra
复制相同的行为,以便按数据库计算和排序。像这样:
Rating.objects.extra(select={'total': "upvotes - downvotes"}).order_by('-total')