Select 两列之间的最高差值

Select the highest difference value between two columns

Table:

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

我需要 select 可用的最高免费 space 服务器。

我的尝试,

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

我也试过这种方法:

server = Server.objects.filter(**{'free_space': (F('total_space')-F('used_space'))}).order_by('-free_space')[: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'])

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)

这会使查询更快,但需要更多 space。