从相关表中添加COUNT字段

时间:2017-05-27 15:25:51

标签: django django-views

我试图找出如何使用另一个表中的计数添加字段。

我有一张桌子上有'项目'还有另一个任务'。这些任务对项目有一个外键。

models.py

class Item(MPTTModel):
    item_title = models.CharField(max_length=250)
    item_parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)

class Task(models.Model):
    task_title = models.CharField(max_length=550)
    item = models.ForeignKey('item.Item')

我查询的视图,并希望在每行项目中添加一个带有计数的列。

views.py

def index(request):
    all_root_items = Item.objects.filter(item_parent__isnull=True)    

    context = {
        'nodes': all_root_items ,       
    }
    return render(request, 'tasks/index.html', context)

所以我希望all_root_items中的每个项目都有一个字段(例如' task_count')。分配给该项目的任务数量是多少。

我尝试了很多不同的想法。但都没有效果。

编辑以澄清我的问题。

all_root_item看起来像这样

items [
   {"item_title" : "item 1", "item_parent" : ""},
   {"item_title" : "item 2", "item_parent" : ""}
]

我想为每个项目添加任务计数。所以它看起来像这样

items [
{"item_title" : "item 1", "item_parent" : "", "task_count" : "6"},
{"item_title" : "item 2", "item_parent" : "", "task_count" : "2"}
]

3 个答案:

答案 0 :(得分:0)

如果您想获取all_root_items中每个项目的所有任务,可以执行以下操作,

item_list = []
for item in all_root_items:
    tasks = Task.objects.filter(item=item)
    for task in tasks:
        item_list.append({'item_title': task.item.item_title, 'item_parent': task.item.item_parent})
print item_list

答案 1 :(得分:0)

我设法解决了这个问题。这就是我改变了

<强> views.py

def index(request):
    all_root_items = Item.objects.filter(item_parent__isnull=True)    

    for item in all_root_items:
        cntTasks = Task.objects.filter(item=item).count()
        item.task_count = cntTasks
    context = {
        'nodes': all_root_items ,       
    }
    return render(request, 'tasks/index.html', context)

在模板中,我可以调用我添加的计数:

for a in nodes
   a.snag_count
endfor

答案 2 :(得分:0)

views.py 中编写您的操作,如下所示:

def index(request):
   all_root_items = Item.objects.filter(item_parent__isnull=True)
   item_list = []
   for item in all_root_items:
      tasks = Task.objects.filter(item=item)

      item_list.append({'item_title': item.item_title, 'item_parent': item.item_parent, "task_count" : len(tasks)  })

   context = {
     'nodes': item_list,       
   }
   return render(request, 'tasks/index.html', context)

您正在计算包​​括每个项目在内的任务,并将其添加到对象数组中。