【问题标题】:Add a field with COUNT from a related table从相关表中添加具有 COUNT 的字段
【发布时间】:2017-05-27 15:25:50
【问题描述】:

我正试图弄清楚如何添加一个包含另一个表中的计数的字段。

我有一个带有“项目”的表格和另一个带有“任务”的表格。任务具有项目的外键。

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"}
]

【问题讨论】:

  • 您想在管理员或模板中显示?
  • @hansTheFranz 在模板中。

标签: django django-views


【解决方案1】:

如果您想获取 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

【讨论】:

  • 我觉得我解释得不够好。我已经更新了我的问题,以阐明我想怎么做。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    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)
    

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

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 1970-01-01
      • 2010-10-13
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      相关资源
      最近更新 更多