Code

Opened 3 years ago

Closed 2 years ago

#16312 closed New feature (wontfix)

models.DateField() doesn't convert a datetime.datetime() to datetime.date()

Reported by: jedie Owned by: nobody
Component: Uncategorized Version: master
Severity: Normal Keywords: DateField
Cc: Triage Stage: Design decision needed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

IMHO models.DateField() should convert a given datetime.datetime() to datetime.date(). It makes this in DateField.to_python(), but the model value is a datetime.datetime()

e.g.:

class Foo(models.Model):
   date = models.DateField()

a = Foo(date=datetime.date(year=2001, month=1, day=1)) # returns a datetime.date(), ok.
a = Foo(date=datetime.datetime(year=2001, month=1, day=1)) # Failure: returns a datetime.datetime() and not a date

Attachments (0)

Change History (4)

comment:1 Changed 3 years ago by lrekucki

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Triage Stage changed from Unreviewed to Accepted

comment:2 Changed 3 years ago by anonymous

  • Triage Stage changed from Accepted to Design decision needed
  • Type changed from Bug to New feature

I sympathise with the reporter as the automatic conversion of values assigned to DateField and DateTimeField to the underlying type would certainly reduce the number of bugs in our codebase.

Unfortunately that's a more general issue, as all the fields bundled with Django don't perform any validation or conversion on assignment (look at BooleanField and IntegerField for a simple example). The validation and conversion is performed only on saving and loading data from database. Changing only the behavior of DateField and DateTimeField would introduce an inconsistency and changing the behavior of all fields would break a lot of code in the wild.

I'm setting this ticket to design decision needed as this is a nice feature proposal, but it introduces a major backwards incompatibility.

comment:3 Changed 3 years ago by zuber

↑ That was me

comment:4 Changed 2 years ago by aaugustin

  • Resolution set to wontfix
  • Status changed from new to closed

Auto-"conversion" of values paves the way for silent data corruption, that isn't a good idea. (I actually think Django is a bit laxist in its to_python methods.) Strict type checking isn't good either — Python favors duck typing.

Since DateField has historically accepted datetimes (and DateTimeField accepted dates), there's not much we can do without breaking backwards compatibility.

zuber is right: an isolated change to DateField isn't the way to go. If you want to work on this, please send a sufficiently detailed proposal to django-developers, summarizing the general problem and addressing backwards compatibility.

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.