在 django 中按相同名称对查询元素进行分组

  • 本文关键字:元素 查询 django django
  • 更新时间 :
  • 英文 :


我被困在这个任务上。我的查询输出如下(使用 list(( 时(:

days=[{'day':1,'do':'paint'},{'day':2,'do':'paint'},{'day':3,'do':'Dry'},{'day':4,'do':'Fubrish'},{'day':5,'do':'Fubrish'},{'day':6,'do':'paint'}]

它来自这个模型:

class Tasks(models.Model):
day_no = models.IntegerField(verbose_name='Number of Day')  # 1, 2, 3, 4, 5, 6
task = models.CharField(max_length=25)

我基本上想遍历每个,看看是否有相同的连续"做",并存储发现的发生总数。 例如第1天和第2天,建议用户进行绘画。第 3 天他做干燥,接下来的 2 天去 Fubrish,然后再次绘画。

我想要一个基本上会说:

paint: 2
dry: 1
fubrish: 2
paint: 1

我确实在我的 jupyter 上玩过,但它是错误的:

tasks={}
total=len(days)
for i in range(0,total):
day = days[i]['day']
do = days[i]['do']
if i == 0:
tasks[do]=1
else:
if i+1 < total:
if days[i+1]['do'] == do:  # the next one is same as current one
tasks[do] = len(tasks) + 1
else:
if tasks.get(do, None) != None:
tasks[do] = len(tasks) + 1
else:
tasks = {}
tasks[do] = 1

您可以使用此函数:

def func(task_list):
if len(task_list) == 0:
return
current = task_list[0]['do']
count = 1
for i in range(1, len(task_list)):
new_task = task_list[i]['do']
if new_task == current:
count+=1
else:
print '%s: %d' %(current, count)
count = 1
current = new_task
print '%s: %d' %(current, count)

它将满足您的要求。

from itertools import groupby
data = [{'grouper': key, 'list': list(group)} for key, group in groupby(queryset, lambda x: getattr(x, 'do')
for d in data:
print d['grouper'], len(d['list')

查询集传递到上面的行,并在最后编辑所需的字段名称。 它将输出为Django 模板标签 {% 重新分组 %} 标签 https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#regroup

你也可以使用defaultdict和下面的代码:

from collections import defaultdict
results = []
prev_task = defaultdict(int)
for d in days:
curr_task = d['do']
if curr_task not in prev_task and len(prev_task) > 0:
results.append(dict(prev_task))
prev_task.clear()
prev_task[curr_task] += 1
if d is days[-1]:
# if this is the last item
results.append(dict(prev_task))

最新更新