mirror of
https://github.com/django/django.git
synced 2025-07-22 20:55:17 +00:00
Fixed #26348 -- Added TruncTime and exposed it through the __time lookup.
Thanks Tim for the review.
This commit is contained in:
parent
082c52dbed
commit
8a4f017f45
12 changed files with 119 additions and 3 deletions
|
@ -9,7 +9,7 @@ from django.db.models import DateField, DateTimeField, IntegerField, TimeField
|
|||
from django.db.models.functions import (
|
||||
Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,
|
||||
ExtractSecond, ExtractWeekDay, ExtractYear, Trunc, TruncDate, TruncDay,
|
||||
TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncYear,
|
||||
TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncTime, TruncYear,
|
||||
)
|
||||
from django.test import TestCase, override_settings
|
||||
from django.utils import timezone
|
||||
|
@ -512,6 +512,30 @@ class DateFunctionTests(TestCase):
|
|||
with self.assertRaisesMessage(ValueError, "Cannot truncate TimeField 'start_time' to DateField"):
|
||||
list(DTModel.objects.annotate(truncated=TruncDate('start_time', output_field=TimeField())))
|
||||
|
||||
def test_trunc_time_func(self):
|
||||
start_datetime = microsecond_support(datetime(2015, 6, 15, 14, 30, 50, 321))
|
||||
end_datetime = microsecond_support(datetime(2016, 6, 15, 14, 10, 50, 123))
|
||||
if settings.USE_TZ:
|
||||
start_datetime = timezone.make_aware(start_datetime, is_dst=False)
|
||||
end_datetime = timezone.make_aware(end_datetime, is_dst=False)
|
||||
self.create_model(start_datetime, end_datetime)
|
||||
self.create_model(end_datetime, start_datetime)
|
||||
self.assertQuerysetEqual(
|
||||
DTModel.objects.annotate(extracted=TruncTime('start_datetime')).order_by('start_datetime'),
|
||||
[
|
||||
(start_datetime, start_datetime.time()),
|
||||
(end_datetime, end_datetime.time()),
|
||||
],
|
||||
lambda m: (m.start_datetime, m.extracted)
|
||||
)
|
||||
self.assertEqual(DTModel.objects.filter(start_datetime__time=TruncTime('start_datetime')).count(), 2)
|
||||
|
||||
with self.assertRaisesMessage(ValueError, "Cannot truncate DateField 'start_date' to TimeField"):
|
||||
list(DTModel.objects.annotate(truncated=TruncTime('start_date')))
|
||||
|
||||
with self.assertRaisesMessage(ValueError, "Cannot truncate DateField 'start_date' to TimeField"):
|
||||
list(DTModel.objects.annotate(truncated=TruncTime('start_date', output_field=DateField())))
|
||||
|
||||
def test_trunc_day_func(self):
|
||||
start_datetime = microsecond_support(datetime(2015, 6, 15, 14, 30, 50, 321))
|
||||
end_datetime = truncate_to(microsecond_support(datetime(2016, 6, 15, 14, 10, 50, 123)), 'day')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue