[英]Django sum of time differences from model fields
我试图从 Django 中的 model 字段中获取时间差的总和。 我已经尝试过了,但我得到了一个没有错误的空结果:
model.py
class Project(models.Model):
design_start = models.DateField(editable= True, default=datetime.today, blank=True)
design_end = models.DateField(editable= True, default=datetime.today, blank=True)
class Portfolio(models.Model):
projects = models.ManyToManyField(Project)
我试图通过从design_end中减去design_start来获得所有项目的总设计时间,然后得到所有项目的总和
视图.py
class DashView(generic.ListView):
context_object_name = 'project_list'
template_name = 'index.html'
queryset = Project.objects.all()
def get_context_data(self, **kwargs):
context = super(DashView, self).get_context_data(**kwargs)
context['design_time'] = Portfolio.objects.all().annotate(
design_time = ExpressionWrapper(Sum(F('projects__design_end') - F('projects__design_start')),
output_field=DurationField()),
)
return context
网址.py
urlpatterns = [
path('', views.DashView.as_view(), name='home'),
]
索引.html
<h4>{{ design_time.design_time }}</h4>
在您看来,您写道:
context['design_time'] = Portfolio.objects.all().annotate(design_time=...)
在这里,您选择的密钥不是很有描述性(即使您似乎被您的这个名字所欺骗)。 这里design_time
是Portfolio
对象的QuerySet
,因此没有design_time.design_time
这样的东西。 相反,如果您遍历design_time
,您将获得Portfolio
实例,这些实例将在其上标注design_time
。 为了更具描述性,首先在上下文中将此键重命名为:
context['portfolios'] = Portfolio.objects.all().annotate(design_time=...)
接下来在您的模板循环中:
{% for portfolio in portfolios %}
{{ portfolio.design_time }}
{% endfor %}
同样在您的查询中,您在Sum
上使用ExpressionWrapper
,而不是在ExpressionWrapper
上使用Sum
:
Portfolio.objects.all().annotate(
design_time = Sum(
ExpressionWrapper(
F('projects__design_end') - F('projects__design_start'),
output_field=DurationField()
)
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.