获取按注释值范围分组的查询集对象



我需要对我的对象进行筛选,使它们按范围分组(范围是固定的,在这种情况下,我们假设有这3个范围[0.0,33.0][33.01,66.0][66.01,100.0]

这是我的模型

class Item(models.Model):
name = models.CharField(
help_text="Itemname",
max_length=256
)
price = models.DecimalField(max_digits=6, decimal_places=2)

我试图得到一个结果,看起来像这样

{
"0.0-33.0": [`
{
"name": "x"
}
],
"33.01-66.0": [
{
"name": "y"
},
{
"name": "Z"
}
]
}

我试过这样做:

item_by_range = Item.objects.filter(price__lte=100.0).annotate(
price_group=Case(
When(price__range=[0.0, 33.0], then=Value('0-33')),
When(price__range=[33.01, 66.0], then=Value('33-66')),
When(price__range=[66.01, 100.0], then=Value('66-100')),
default=Value('No group'),
output_field=CharField(),
)
).values('name', 'price_group').order_by('price_group')

但这只适用于我只在values中传递price_group但这样我就失去了商品的名称

谢谢。

您只需要对groupby(…)做一些后处理<一口>[Python-doc]itertools模块<一口>[Python-doc]:

from itertools import groupby
from operator import itemgetter
result = {
k: [dict(name=v['name']) for v in vs]
for k, vs ingroupby(item_by_range, itemgetter('price_group'))
}

这将使字典看起来像:

{
"0.0-33.0": [
{"name": x}
],
"33.01-66.0": [
{"name": y},
{"name": z}
}
}

您不能创建一个对象,其中相同的键(这里是"name")出现多次。

最新更新