[Django]-RuntimeWarning: DateTimeField received a naive datetime

718πŸ‘

βœ…

The problem is not in Django settings, but in the date passed to the model. Here’s how a timezone-aware object looks like:

>>> from django.utils import timezone
>>> import pytz
>>> timezone.now()
datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)

And here’s a naive object:

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)

So if you are passing email date anywhere (and it eventually gets to some model), just use Django’s now(). If not, then it’s probably an issue with an existing package that fetches date without timezone and you can patch the package, ignore the warning or set USE_TZ to False.

πŸ‘€kravietz

209πŸ‘

Use django.utils.timezone.make_aware function to make your naive datetime objects timezone aware and avoid those warnings.

It converts naive datetime object (without timezone info) to the one that has timezone info (using timezone specified in your django settings if you don’t specify it explicitly as a second argument):

import datetime
from django.conf import settings
from django.utils.timezone import make_aware

naive_datetime = datetime.datetime.now()
naive_datetime.tzinfo  # None

settings.TIME_ZONE  # 'UTC'
aware_datetime = make_aware(naive_datetime)
aware_datetime.tzinfo  # <UTC>
πŸ‘€dmrz

64πŸ‘

Just to fix the error to set current time

from django.utils import timezone
import datetime

datetime.datetime.now(tz=timezone.utc) # you can use this value
πŸ‘€Sachin G.

24πŸ‘

Quick and dirty – Turn it off:

USE_TZ = False

in your settings.py

πŸ‘€gies0r

24πŸ‘

make sure settings.py has
USE_TZ = True

In your python file:

from django.utils import timezone

timezone.now() # use its value in model field

πŸ‘€Jay Soni

17πŸ‘

One can both fix the warning and use the timezone specified in settings.py, which might be different from UTC.

For example in my settings.py I have:

USE_TZ = True
TIME_ZONE = 'Europe/Paris'

Here is a solution; the advantage is that str(mydate) gives the correct time:

>>> from datetime import datetime
>>> from django.utils.timezone import get_current_timezone
>>> mydate = datetime.now(tz=get_current_timezone())
>>> mydate
datetime.datetime(2019, 3, 10, 11, 16, 9, 184106, 
    tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)
>>> str(mydate)
'2019-03-10 11:16:09.184106+01:00'

Another equivalent method is using make_aware, see dmrz post.

πŸ‘€Edouard Thiel

14πŸ‘

If you are trying to transform a naive datetime into a datetime with timezone in django, here is my solution:

>>> import datetime
>>> from django.utils import timezone
>>> t1 = datetime.datetime.strptime("2019-07-16 22:24:00", "%Y-%m-%d %H:%M:%S")
>>> t1
    datetime.datetime(2019, 7, 16, 22, 24)
>>> current_tz = timezone.get_current_timezone()
>>> t2 = current_tz.localize(t1)
>>> t2
    datetime.datetime(2019, 7, 16, 22, 24, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>>

t1 is a naive datetime and t2 is a datetime with timezone in django’s settings.

πŸ‘€hcf1425

13πŸ‘

You can also override settings, particularly useful in tests:

from django.test import override_settings

with override_settings(USE_TZ=False):
    # Insert your code that causes the warning here
    pass

This will prevent you from seeing the warning, at the same time anything in your code that requires a timezone aware datetime may give you problems. If this is the case, see kravietz answer.

πŸ‘€radtek

8πŸ‘

In the model, do not pass the value:

timezone.now()

Rather, remove the parenthesis, and pass:

timezone.now

If you continue to get a runtime error warning, consider changing the model field from DateTimeField to DateField.

πŸ‘€dehidehidehi

1πŸ‘

I use function to covert date -> datetime aware format like this:

from datetime import datetime, date
from django.utils import timezone

def date_to_datetime_aware(d:date) -> datetime:
    dt = datetime.combine(d, datetime.min.time())
    dt_aware = timezone.make_aware(dt)
    return dt_aware

It helps me to awoid Django RuntimeWarning.

πŸ‘€Gogicool

0πŸ‘

If you need to convert the actual date string to date object, I have got rid of the warning by simply using astimezone:

>>> from datetime import datetime, timezone
>>> datetime_str = '2013-09-04 14:14:13.698105'
>>> datetime_object = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S.%f")
>>> datetime_object.astimezone(timezone.utc)
datetime.datetime(2013, 9, 4, 6, 14, 13, 698105, tzinfo=datetime.timezone.utc)
πŸ‘€codecumber

-1πŸ‘

I encountered this warning when using the following model.

from datetime import datetime

class MyObject(models.Model):
    my_date = models.DateTimeField(default=datetime.now)

To fix it, I switched to the following default.

from django.utils import timezone

class MyObject(models.Model):
    my_date = models.DateTimeField(default=timezone.now)
πŸ‘€henyxia

Leave a comment