首页 > 解决方案 > 在 django 上计算时间

问题描述

我有以下代码:

def index(request):
events_list = Timesheet.objects.filter(owner = request.user.pk, week = datetime.datetime.now().isocalendar()[1]).order_by('-working_hour')
total_hours_week = Timesheet.objects.annotate(total_hours_per_week=Sum('working_hour')).filter(owner = request.user.pk,  week = datetime.datetime.now().isocalendar()[1])

return render(request, "timesheet/index.html", {'events_list': events_list, 'total_hours_week': total_hours_week})

total_hours_week 返回当前错误:

您不能在 sqlite3 中的日期/时间字段上使用 Sum、Avg、StdDev 和 Variance 聚合,因为日期/时间保存为文本。

你知道如何解决吗?

提前谢谢

标签: djangotimeaggregate

解决方案


您可以检查当前的数据库引擎是否为 sqlite3,并在需要时以编程方式计算注释:

from django.conf import settings


def index(request):
    db_engine = settings.DATABASES['default']['ENGINE']

    if db_engine = 'django.db.backends.sqlite3':
        total_hours_week = [] # Calculate annotation programmatically
    else:
        total_hours_week = Timesheet.objects.annotate(total_hours_per_week=Sum('working_hour')).filter(owner = request.user.pk,  week = datetime.datetime.now().isocalendar()[1])
    events_list = Timesheet.objects.filter(owner = request.user.pk, week = datetime.datetime.now().isocalendar()[1]).order_by('-working_hour')

    return render(request, "timesheet/index.html", {'events_list': events_list, 'total_hours_week': total_hours_week})

但是,如果您仅将 sqlite3 用于开发,并且您需要大量使用时间聚合,我强烈建议您为您的开发环境设置一个 PostgreSQL/MySql 服务器,因为它可以为您节省大量时间和长时间的头痛跑。


推荐阅读