显示在Django模型中创建的项目总数

时间:2019-01-07 15:15:35

标签: django

我的Django项目包含一个带有“项目和任务”的任务管理器,我有一个通用列表页面,其中显示了所有项目的列表以及有关其总任务的信息:

class IndexView(generic.ListView):
    template_name = 'projects/index.html'
    context_object_name = 'project_list'

    def get_queryset(self):
        """Return 10 projects."""
        return Project.objects.order_by('is_complete')[:10]

我想在列表页面上显示添加的项目和任务的总数,但是我不确定应该如何处理。我目前的所有工作都是围绕列出每个项目中包含的任务数量,但是现在我想要一个总数-我应该将此添加为新视图吗?例如,我尝试将其添加到上面的视图中:

def total_projects(self):
    return Project.objects.count()

然后在模板上调用{{ project_list.total_projects }},但不会返回任何内容。

查看是否是执行此操作的正确位置?

2 个答案:

答案 0 :(得分:2)

  

当前工作中的所有工作都是围绕列出每个项目中包含的任务数量,但是现在我想要一个总数-我应该将其添加为新视图吗?

这取决于。如果您只想显示数据库中前10个已完成项目的项目和任务总数(请注意,get_queryset方法就是这样做的),那么我将同时执行所有步骤视图(仅显示一些数字就创建一个新视图是没有用的,这不是ListView IMO的目的。)

另一方面,您正在从模型的实例中调用类的实例方法(total_projects)。该方法在模型上不存在,并且当在模板中调用它时,如果对象中不存在属性/方法,您将一无所获。基于上一段,我将使用get_context_data在视图的上下文中设置它:

def get_context_data(self, **kwargs):
    data = super().get_context_data(**kwargs)
    data["total_projects"] = Projects.objects.count()
    # I'm assuming you only need the whole number of tasks with no separation
    data["total_tasks"] = Task.objects.count()

    return data

最后,您可以编辑get_queryset方法并将其设置为instance attribute(如果您希望它更简洁并且可以在不使用其他代码的情况下进行过滤):

class IndexView(generic.ListView):
    queryset = Project.objects.order_by('is_complete')[:10]

答案 1 :(得分:1)

我认为将函数定义放在Model类中(从外观上来看Project,然后在函数上方添加@property标签是更常见的情况。

class Project(models.Model):
    ''' definitions and stuff '''

    @property
    def total_projects(self): # etc...

对于您的特定情况,您可以完全放弃该功能,而只需在模板中使用{{ project_list.count }}{{ project_list|length }}

关于docscountlength的注释:

  

count()调用在幕后执行SELECT COUNT(*),因此您   应该始终使用count()而不是将所有记录加载到   Python对象并在结果上调用len()(除非您需要   无论如何将对象加载到内存中,在这种情况下len()将是   更快)。

     

请注意,如果要获得QuerySet中的项目数,还需要   从中检索模型实例(例如,通过遍历   ),使用len(queryset)可能会更有效   导致像count()这样的额外数据库查询。

因此请使用正确的一种。

此外,根据this answer和@djangomachine的以下注释,length可能不会总是返回与count相同数量的记录。如果准确性很重要,则不管上述情况如何,最好使用count