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

49,245

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
Share:
49,245

Related videos on Youtube

William P.
Author by

William P.

Updated on January 10, 2021

Comments

  • William P.
    William P. over 3 years

    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:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\ba
    se.py", line 820, in _save_table
        result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\ba
    se.py", line 859, in _do_insert
        using=using, raw=raw)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\ma
    nager.py", line 122, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\qu
    ery.py", line 1039, in _insert
        return query.get_compiler(using=using).execute_sql(return_id)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\sq
    l\compiler.py", line 1059, in execute_sql
        for sql, params in self.as_sql():
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\sq
    l\compiler.py", line 1019, in as_sql
        for obj in self.query.objs
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\sq
    l\compiler.py", line 958, in prepare_value
        value = field.get_db_prep_save(value, connection=self.connection)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
    elds\__init__.py", line 728, in get_db_prep_save
        prepared=False)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
    elds\__init__.py", line 1461, in get_db_prep_value
        value = self.get_prep_value(value)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
    elds\__init__.py", line 1440, in get_prep_value
        value = super(DateTimeField, self).get_prep_value(value)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
    elds\__init__.py", line 1296, in get_prep_value
        return self.to_python(value)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
    elds\__init__.py", line 1399, in to_python
        parsed = parse_datetime(value)
      File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\utils\datepa
    rse.py", line 93, in parse_datetime
        match = datetime_re.match(value)
    TypeError: expected string or buffer
    
    • Sayse
      Sayse almost 8 years
      Aside from Selcuk's answer, you might want to avoid setting the methods default to the now() method. I'm pretty sure it won't be executed every time you call the function... just when first initialized
    • William P.
      William P. almost 8 years
      @Sayse So do you any idea about how I can give another date instead of now() ?
    • Sayse
      Sayse almost 8 years
      now is correct (and I suspect you may still be running the old code and may need to restart the dev server). Simpy set the default to None and then check inside the method if it is none and if so set it to now inside of it
    • William P.
      William P. almost 8 years
      @Sayse I restarted the server but nothing changed. I am so sorry but could I ask you where and how I set the default to None ? I am still a newbie ...
    • Sayse
      Sayse almost 8 years
      def _create_cart_in_database(self, creationDate=None..
    • William P.
      William P. almost 8 years
      @Sayse I set the default to None but he continues to give me the same error with actual datetime ...
    • Sayse
      Sayse almost 8 years
      William P, that wouldn't stop this error, it would stop a different one from occuring. You should try to create a minimal reproducible example, the given duplicate and Selcuks answer should solve the problem.
    • Aditya Pandhare
      Aditya Pandhare almost 8 years
      this is curious. can you try "models.DateTimeField(auto_now_add = True)" and let us know what happens
    • William P.
      William P. almost 8 years
      @AdityaPandhare I tried your solution and I edited my post where you can find the new error
    • Aditya Pandhare
      Aditya Pandhare almost 8 years
      if you can, clear up your migrations and try it once more. refer to stackoverflow.com/questions/27220480/…
  • Mukund Gandlur
    Mukund Gandlur almost 8 years
    Here the timezone would be the server's timezone right? What should we do if there are users across different timezones and we want to record their time zones?
  • Selcuk
    Selcuk almost 8 years
    @MukundGandlur There is no "user" as far as ORM is concerned. If you want to take the web site users' (via django-auth) timezones into account, you must write a view that sends the correct datetime to the helper method.
  • user3595632
    user3595632 about 7 years
    My settings are USE_TZ = True, TIME_ZONE = 'UTC'. But when I use timezone.now() it doesn't show tzinfo=<UTC>.... So this datetime object is passed as naive one. Why does it happen?
  • Selcuk
    Selcuk about 7 years
    @user3595632 Yes, strptime doesn't return timezone aware datetimes. See this question.