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。
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。