选择两列之间的最高差值

时间:2015-08-27 11:37:25

标签: django django-models django-orm

表:

var initializedList = new double[10].ToList()

我需要选择可用空间最大的服务器。

我的尝试,

| Server ID | Total HDD Space | Used HDD Space |
|   alpha   |      1000       |      10        |
|   bravo   |      1500       |     1000       |

发出此错误:

server = Server.objects.filter(free_space=(F('total_space')-F('used_space'))).order_by('-free_space')[:1]

我也尝试过这种方式:

Cannot resolve keyword 'free_space' into field. Choices are: image, name, total_space, used_space

谢谢。

2 个答案:

答案 0 :(得分:1)

你可以在Django 1.8中执行此操作,它具有新的查询功能(release notes)。

servers = Server.objects.annotate(free_space=(F('total_space')-F('used_space'))).order_by('free_space')

在早期版本的Django上,您可以使用extra()

servers = Server.objects.extra(select={'free_space': 'total_space-used_space'}, order_by=['-free_space'])

答案 1 :(得分:0)

Alasdair的回复是正确的。或者,您可能只想在新列中缓存差异:

class Server(models.Model):
    total_hdd_space = models.PositiveIntegerField(...)
    used_hdd_space = models.PositiveIntegerField(...)
    free_hdd_space = models.PositiveIntegerField(...)

    def save(*args, **kwargs):
         self.free_hdd_space = self.total_hdd_space - self.used_hdd_space
         super(Server, self).save(*args, **kwargs)

这会使查询更快但占用更多空间。