Opened 6 months ago

Last modified 4 weeks ago

#37013 closed Bug

Omitting tzinfo argument to Trunc & Extract with USE_TZ = True and TIME_ZONE != UTC creates ambiguity for migrations — at Initial Version

Reported by: Jacob Walls Owned by:
Component: Database layer (models, ORM) Version: 6.0
Severity: Normal Keywords: tzinfo, TIME_ZONE, Extract, Trunc
Cc: Huwaiza Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The Trunc() and Extract() database functions apply timezone conversions if USE_TZ = True. When the tzinfo argument is omitted, the timezone is inferred from settings.TIME_ZONE. This information is not captured by migrations, meaning that if settings.TIME_ZONE changes over the life of a project, then the database may never receive a corresponding update.

from django.db import models
from django.db.models.functions import ExtractHour, Now

class Person(models.Model):
    hour = models.IntegerField(db_default=ExtractHour(Now()))

To reproduce:

  • Change settings.TIME_ZONE to "America/Chicago".
  • Make migrations, notice no migration generated.
  • Emulating the database-default python-side (as SQLite must do sometimes, see rest of linked forum post) now no longer produces the same value as the database.

In this ​forum reply, there was an idea to implement Trunc/Extract.deconstruct() to deprecate omitting tzinfo if serialized into a migration and eventually make it default to get_current_timezone() when not provided.

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top