繁体   English   中英

Django 与 model 字段的时间差总和

[英]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_timePortfolio对象的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM