gpt4 book ai didi

python - Django ORM - 获取最大分组依据

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:25 26 4
gpt4 key购买 nike

我有三个模型。

数据中心

class Datacenter(models.Model):
"""
Datacenter
"""

uuid = models.UUIDField(verbose_name=_('UUID'), unique=True, default=uuid.uuid1, editable=False)
name = models.CharField(_('name'), max_length=80, db_index=True)
price_per_gigabyte = models.DecimalField(_('price per gigabyte'), max_digits=36, decimal_places=18, default=0, db_index=True)

class Meta:
verbose_name = _('datacenter')
verbose_name_plural = _('datacenters')
ordering = ['name']

def __str__(self):
return f'{self.name} / ${self.price_per_gigabyte:.2f} per GB'

服务器

class Server(models.Model):
"""
Server
"""

uuid = models.UUIDField(verbose_name=_('UUID'), unique=True, default=uuid.uuid1, editable=False)
hostname = models.CharField(_('hostname'), max_length=253, db_index=True)
datacenter = models.ForeignKey(Datacenter, models.PROTECT, related_name="servers", related_query_name="server", verbose_name=_('datacenter'))
useful_storage_capacity = models.PositiveSmallIntegerField(_('useful storage capacity'), default=0, db_index=True)

class Meta:
verbose_name = _('server')
verbose_name_plural = _('servers')
ordering = ['hostname']

def __str__(self):
return self.hostname

存储

class Storage(models.Model):
"""
Storage Resource
"""

uuid = models.UUIDField(verbose_name=_('UUID'), unique=True, default=uuid.uuid1, editable=False)
server = models.ForeignKey(Server, models.PROTECT, related_name="storages", related_query_name="storage", verbose_name=_('server'))
project = models.ForeignKey(Project, models.PROTECT, related_name="storages", related_query_name="storage", verbose_name=_('project'))
space_used_latest_copy = models.PositiveSmallIntegerField(_('space used latest copy'), db_index=True)
space_used_repository = models.PositiveSmallIntegerField(_('space used repository'), db_index=True)
space_used_other = models.PositiveSmallIntegerField(_('space used other'), db_index=True)

class Meta:
verbose_name = _('storage resource')
verbose_name_plural = _('storage resources')
unique_together = (('server', 'project'),)
ordering = ['server', 'project']

def __str__(self):
return f'{self.uuid} ({self.project}/{self.server})'

def get_space_used_total(self):
return self.space_used_latest_copy + self.space_used_repository + self.space_used_other

数据中心可以有许多服务器。从存储模型我可以得到服务器上使用了多少空间。

我需要获取数据中心可用空间最多的服务器(只有一个)。

这是目前所拥有的:

servers = Server.objects.all() \
.annotate(free=F('useful_storage_capacity') - Coalesce(Sum('storage__space_used_latest_copy'), V(0)) - Coalesce(Sum('storage__space_used_repository'), V(0))
- Coalesce(Sum('storage__space_used_other'), V(0))) \
.filter(free__gte=space_prepaid) \
.order_by('-free')

我注释字段“free”,其中包含服务器可用空间。我需要以某种方式按数据中心对其进行分组并获得最大的免费值。所以最后我从每个数据中心得到了一台最免费的服务器。

找不到任何如何正确执行此操作的示例。解决办法是什么?

谢谢!

最佳答案

您需要使用values or values_list进行 GROUP BY 查询。

servers = Server.objects.all() \
.values('datacenter__uuid', 'id') \
.annotate(free=F('useful_storage_capacity') - Coalesce(Sum('storage__space_used_latest_copy'), V(0)) - Coalesce(Sum('storage__space_used_repository'), V(0))
- Coalesce(Sum('storage__space_used_other'), V(0))) \
.annotate(max_free=Max(F('free'))
.filter(free__gte=space_prepaid, free=F('max_free')) \
.values('datacenter__uuid', 'id', 'free')
.order_by('-free')

我认为这应该为每个数据中心提供最免费的服务器。 .values, .filter, and .annotate matter的订购所以这可能会有点棘手。尝试使用这些方法。

关于python - Django ORM - 获取最大分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45412878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com