summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2026-02-16 21:27:35 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2026-02-28 16:01:08 +0100
commit202eca7795710c82cd64a248650afc64f905a17e (patch)
treef33f72ac8a87cd0f139015e2a92140f153dc5954 /django/db
parentfcd06f6807f7e2cbf53c9805083d518943c97af8 (diff)
Added DatabaseOperations.convert_trunc_expression() hook.
Needed on MongoDB.
Diffstat (limited to 'django/db')
-rw-r--r--django/db/backends/base/operations.py21
-rw-r--r--django/db/models/functions/datetime.py20
2 files changed, 21 insertions, 20 deletions
diff --git a/django/db/backends/base/operations.py b/django/db/backends/base/operations.py
index fac6215899..bc1752df6f 100644
--- a/django/db/backends/base/operations.py
+++ b/django/db/backends/base/operations.py
@@ -7,7 +7,7 @@ from itertools import chain
import sqlparse
from django.conf import settings
-from django.db import NotSupportedError, transaction
+from django.db import NotSupportedError, models, transaction
from django.db.models.expressions import Col
from django.db.models.fields.composite import CompositePrimaryKey
from django.utils import timezone
@@ -684,6 +684,25 @@ class BaseDatabaseOperations:
if value is not None:
return datetime.timedelta(0, 0, value)
+ def convert_trunc_expression(self, value, expression):
+ if isinstance(expression.output_field, models.DateTimeField):
+ if not settings.USE_TZ:
+ pass
+ elif value is not None:
+ value = value.replace(tzinfo=None)
+ value = timezone.make_aware(value, expression.tzinfo)
+ elif not self.connection.features.has_zoneinfo_database:
+ raise ValueError(
+ "Database returned an invalid datetime value. Are time "
+ "zone definitions for your database installed?"
+ )
+ elif isinstance(value, datetime.datetime):
+ if isinstance(expression.output_field, models.DateField):
+ value = value.date()
+ elif isinstance(expression.output_field, models.TimeField):
+ value = value.time()
+ return value
+
def check_expression_support(self, expression):
"""
Check that the backend supports the provided expression.
diff --git a/django/db/models/functions/datetime.py b/django/db/models/functions/datetime.py
index b536690c8a..842987bf26 100644
--- a/django/db/models/functions/datetime.py
+++ b/django/db/models/functions/datetime.py
@@ -1,5 +1,3 @@
-from datetime import datetime
-
from django.conf import settings
from django.db.models.expressions import Func
from django.db.models.fields import (
@@ -344,23 +342,7 @@ class TruncBase(TimezoneMixin, Transform):
return copy
def convert_value(self, value, expression, connection):
- if isinstance(self.output_field, DateTimeField):
- if not settings.USE_TZ:
- pass
- elif value is not None:
- value = value.replace(tzinfo=None)
- value = timezone.make_aware(value, self.tzinfo)
- elif not connection.features.has_zoneinfo_database:
- raise ValueError(
- "Database returned an invalid datetime value. Are time "
- "zone definitions for your database installed?"
- )
- elif isinstance(value, datetime):
- if isinstance(self.output_field, DateField):
- value = value.date()
- elif isinstance(self.output_field, TimeField):
- value = value.time()
- return value
+ return connection.ops.convert_trunc_expression(value, expression)
class Trunc(TruncBase):