Django : RunTimeWarning : DateTimeField received a naive datetime while time zone support is active

Question:

I am trying to test a cart creation based on django cart

But I have this error when I am trying to create the cart :

RunTimeWarning : DateTimeField received a naive datetime while time zone support is active

I did some research but I couldn’t resolve my problem for datetime.datetime.now()

test_views.py in my tests directory :

from django.test import TestCase, Client, RequestFactory
import unittest
from django.contrib.auth.models import User, AnonymousUser
from front.models import Entreprise, Cart, CartItems
from decimal import Decimal
from front.cart import models
import datetime
import pytz
from pytz import all_timezones
from django.utils import timezone



def _create_cart_in_database(self, creationDate=datetime.datetime.now(), checkedOutDate=True):
    """
        Helper function so I don't repeat myself
    """
    cart = models.Cart()
    cart.creationDate = creationDate
    cart.checkedOutDate = False
    cart.save()
    return cart


def test_cart_creation(self):
    creationDate = datetime.datetime.now()
    cart = self._create_cart_in_database(creationDate)
    id = cart.id

    cart_from_database = models.Cart.objects.get(pk=id)
    self.assertEquals(cart, cart_from_database)

models.py :

class Cart(models.Model):
    creationDate = models.DateTimeField()

I also have USE_TZ = True in my settings.

I tried timezone.now() but still doesn’t work :

def _create_cart_in_database(self, creationDate=timezone.now(), checkedOutDate=True):

def test_cart_creation(self):
    creationDate = timezone.now()

RunTimeWarning : DateTimeField Cart.creationDate received a naive datetime (2016-06-03 08:46:34.829000) while time zone support is active.

EDIT :

I have this error now and it seems an error format datetime ?

    updated = self._save_table(raw, cls, force_insert, force_update, using, upda
te_fields)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsba
se.py", line 820, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsba
se.py", line 859, in _do_insert
    using=using, raw=raw)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsma
nager.py", line 122, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsqu
ery.py", line 1039, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelssq
lcompiler.py", line 1059, in execute_sql
    for sql, params in self.as_sql():
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelssq
lcompiler.py", line 1019, in as_sql
    for obj in self.query.objs
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelssq
lcompiler.py", line 958, in prepare_value
    value = field.get_db_prep_save(value, connection=self.connection)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsfi
elds__init__.py", line 728, in get_db_prep_save
    prepared=False)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsfi
elds__init__.py", line 1461, in get_db_prep_value
    value = self.get_prep_value(value)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsfi
elds__init__.py", line 1440, in get_prep_value
    value = super(DateTimeField, self).get_prep_value(value)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsfi
elds__init__.py", line 1296, in get_prep_value
    return self.to_python(value)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangodbmodelsfi
elds__init__.py", line 1399, in to_python
    parsed = parse_datetime(value)
  File "C:Python27libsite-packagesdjango-1.9.5-py2.7.eggdjangoutilsdatepa
rse.py", line 93, in parse_datetime
    match = datetime_re.match(value)
TypeError: expected string or buffer
Asked By: William P.

||

Answers:

The following line creates a naive (non-timezone aware) datetime:

creationDate = datetime.datetime.now()

Try changing that line to:

creationDate = timezone.now()

Don’t forget to import timezone at the beginning of your code:

from django.utils import timezone
Answered By: Selcuk