我的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 }}
,但不会返回任何内容。
查看是否是执行此操作的正确位置?
答案 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 }}
。
关于docs中count
与length
的注释:
count()调用在幕后执行SELECT COUNT(*),因此您 应该始终使用count()而不是将所有记录加载到 Python对象并在结果上调用len()(除非您需要 无论如何将对象加载到内存中,在这种情况下len()将是 更快)。
请注意,如果要获得QuerySet中的项目数,还需要 从中检索模型实例(例如,通过遍历 ),使用len(queryset)可能会更有效 导致像count()这样的额外数据库查询。
因此请使用正确的一种。
此外,根据this answer和@djangomachine的以下注释,length
可能不会总是返回与count
相同数量的记录。如果准确性很重要,则不管上述情况如何,最好使用count
。