diff --git a/django_mongodb/base.py b/django_mongodb/base.py index 92c85cb1..79e21660 100644 --- a/django_mongodb/base.py +++ b/django_mongodb/base.py @@ -145,7 +145,6 @@ def _connect(self): self.connection = MongoClient( host=settings_dict["HOST"] or None, port=int(settings_dict["PORT"] or 27017), - tz_aware=True, **options, ) db_name = settings_dict["NAME"] diff --git a/django_mongodb/features.py b/django_mongodb/features.py index 08c7cbe2..bf04ecf0 100644 --- a/django_mongodb/features.py +++ b/django_mongodb/features.py @@ -7,6 +7,8 @@ class DatabaseFeatures(BaseDatabaseFeatures): supports_ignore_conflicts = False # Not implemented: https://github.com/mongodb-labs/django-mongodb/issues/8 supports_json_field = False + # MongoDB stores datetimes in UTC. + supports_timezones = False # Not implemented: https://github.com/mongodb-labs/django-mongodb/issues/7 supports_transactions = False uses_savepoints = False @@ -20,7 +22,6 @@ class DatabaseFeatures(BaseDatabaseFeatures): "basic.tests.ModelLookupTest.test_does_not_exist", "basic.tests.ModelLookupTest.test_equal_lookup", "basic.tests.ModelLookupTest.test_rich_lookup", - "basic.tests.ModelTest.test_year_lookup_edge_case", "lookup.tests.LookupTests.test_chain_date_time_lookups", "lookup.test_timefield.TimeFieldLookupTests.test_hour_lookups", "lookup.test_timefield.TimeFieldLookupTests.test_minute_lookups", @@ -286,8 +287,8 @@ class DatabaseFeatures(BaseDatabaseFeatures): "timezones.tests.LegacyDatabaseTests.test_cursor_execute_accepts_naive_datetime", "timezones.tests.LegacyDatabaseTests.test_cursor_execute_returns_naive_datetime", "timezones.tests.LegacyDatabaseTests.test_raw_sql", - "timezones.tests.NewDatabaseTests.test_cursor_execute_accepts_aware_datetime", - "timezones.tests.NewDatabaseTests.test_cursor_execute_returns_aware_datetime", + "timezones.tests.NewDatabaseTests.test_cursor_execute_accepts_naive_datetime", + "timezones.tests.NewDatabaseTests.test_cursor_execute_returns_naive_datetime", "timezones.tests.NewDatabaseTests.test_cursor_explicit_time_zone", "timezones.tests.NewDatabaseTests.test_raw_sql", }, diff --git a/django_mongodb/operations.py b/django_mongodb/operations.py index 4b210321..311c799c 100644 --- a/django_mongodb/operations.py +++ b/django_mongodb/operations.py @@ -17,8 +17,16 @@ def adapt_datefield_value(self, value): return datetime.datetime.combine(value, datetime.datetime.min.time()) def adapt_datetimefield_value(self, value): - if not settings.USE_TZ and value is not None and timezone.is_naive(value): - value = timezone.make_aware(value) + if value is None: + return None + if timezone.is_aware(value): + if settings.USE_TZ: + value = timezone.make_naive(value, self.connection.timezone) + else: + raise ValueError( + "MongoDB backend does not support timezone-aware " + "datetimes when USE_TZ is False." + ) return value def adapt_decimalfield_value(self, value, max_digits=None, decimal_places=None): @@ -31,6 +39,8 @@ def adapt_timefield_value(self, value): """Store TimeField as datetime.""" if value is None: return None + if timezone.is_aware(value): + raise ValueError("MongoDB backend does not support timezone-aware times.") return datetime.datetime.combine(datetime.datetime.min.date(), value) def get_db_converters(self, expression): @@ -39,7 +49,7 @@ def get_db_converters(self, expression): if internal_type == "DateField": converters.append(self.convert_datefield_value) elif internal_type == "DateTimeField": - if not settings.USE_TZ: + if settings.USE_TZ: converters.append(self.convert_datetimefield_value) elif internal_type == "DecimalField": converters.append(self.convert_decimalfield_value) @@ -56,8 +66,7 @@ def convert_datefield_value(self, value, expression, connection): def convert_datetimefield_value(self, value, expression, connection): if value is not None: - # Django expects naive datetimes when settings.USE_TZ is False. - value = timezone.make_naive(value) + value = timezone.make_aware(value, self.connection.timezone) return value def convert_decimalfield_value(self, value, expression, connection):