在Django ORM中合并日期时间

时间:2019-03-13 11:59:22

标签: django

我试图合并日期和时间。为此,我使用了datetime.combine。但这给了AttributeError module 'datetime' has no attribute 'combine'

TimesheetEntry.objects.filter(
    timesheet_users = user_id
    ).order_by(
        '-id'
    ).annotate(
        timesheet_clock_in=datetime.combine('timesheet_clock_in_date', 'timesheet_clock_in_time') 
    ).annotate(
        timesheet_clock_out=datetime.combine('timesheet_clock_out_date', 'timesheet_clock_out_time')
    ).values_list(
        'timesheet_clock_in',
        'timesheet_clock_out',
        'timesheet_jobs',
        'timesheet_note',
        'timesheet_clock_in_by'
    )

我知道错误在annotate中,但我不知道如何解决。查询无需使用annotate

3 个答案:

答案 0 :(得分:3)

您正确导入了datetime吗?

import datetime
# The datetime module

from datetime import datetime
# The datetime class in the datetime module

在第一种情况下,您应该致电datetime.datetime.combine(使用2x datetime)。在第二种情况下,您可以直接致电datetime.combine

答案 1 :(得分:3)

this answer外,还使用F()表达式

from django.db.models import F
from datetime import datetime

TimesheetEntry.objects.filter(
    timesheet_users=user_id
).order_by(
    '-id'
).annotate(
    timesheet_clock_in=datetime.combine(F('timesheet_clock_in_date'), F('timesheet_clock_in_time'))
).annotate(
    timesheet_clock_out=datetime.combine(F('timesheet_clock_out_date'), F('timesheet_clock_out_time'))
).values_list(
    'timesheet_clock_in',
    'timesheet_clock_out',
    'timesheet_jobs',
    'timesheet_note',
    'timesheet_clock_in_by'
)

答案 2 :(得分:1)

date.combine()不起作用,因为它会引发参数1必须是datetime.date,而不是F

这是我们处理此问题的方法:

from django.db.models import Value
from django.db.models.functions import Cast, Concat

TimesheetEntry.objects.filter(
    timesheet_users=user_id
).order_by(
    '-id'
).annotate(
    timesheet_clock_in=Cast(
        Concat('timesheet_clock_in_date', Value(" "), 'timesheet_clock_in_time', output_field=DateTimeField()),
        output_field=DateTimeField()
    )
    timesheet_clock_out=Cast(
        Concat('timesheet_clock_out_date', Value(" "), 'timesheet_clock_out_time', output_field=DateTimeField()),
        output_field=DateTimeField()
    )
).values_list(
    'timesheet_clock_in',
    'timesheet_clock_out',
    'timesheet_jobs',
    'timesheet_note',
    'timesheet_clock_in_by'
)