Naive datetime #3

Closed
opened 2021-12-17 09:42:05 +01:00 by Sulley · 4 comments
Owner
/Users/redj/Dev/.virtualenvs/ultron/lib/python3.10/site-packages/django/db/models/fields/__init__.py:1358: RuntimeWarning: DateTimeField Event.datebegin received a naive datetime (2021-12-17 00:00:00) while time zone support is active.
  warnings.warn("DateTimeField %s.%s received a naive datetime "
``` /Users/redj/Dev/.virtualenvs/ultron/lib/python3.10/site-packages/django/db/models/fields/__init__.py:1358: RuntimeWarning: DateTimeField Event.datebegin received a naive datetime (2021-12-17 00:00:00) while time zone support is active. warnings.warn("DateTimeField %s.%s received a naive datetime " ```
Sulley added the
bug
label 2021-12-17 09:42:05 +01:00
Collaborator

Le problème ici est que par défaut, les valeurs datetime ne sont pas localisées par rapport à un fuseau horaire.
Comme ce paramètre existe normalement au niveau de ton fichier de configuration (la propriété se trouve en tout cas par défaut dans tout nouveau projet), il suffirait d'utiliser les objets de type timezone provenant des paquets django.utils.

Tu dois malgré tout modifier le paramètre USE_TZ à True.

Par exemple:

>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2021, 12, 27, 13, 53, 7, ...)

Cf. https://docs.djangoproject.com/en/4.0/topics/i18n/timezones/#concepts

Le problème ici est que par défaut, les valeurs `datetime` ne sont pas localisées par rapport à un fuseau horaire. Comme ce paramètre existe normalement au niveau de ton fichier de configuration (la propriété se trouve en tout cas par défaut dans tout nouveau projet), il suffirait d'utiliser les objets de type `timezone` provenant des paquets `django.utils`. Tu dois malgré tout modifier le paramètre `USE_TZ` à `True`. Par exemple: ```python >>> from django.utils import timezone >>> timezone.now() datetime.datetime(2021, 12, 27, 13, 53, 7, ...) ``` Cf. https://docs.djangoproject.com/en/4.0/topics/i18n/timezones/#concepts
Sulley added
improvement
and removed
bug
labels 2021-12-28 15:06:34 +01:00
Author
Owner

J'ai fait comme tu m'as conseillé (du moins, comme je l'ai compris) :

from django.utils import timezone

…
…
…


class Temporizable(models.Model):
    """
    Classe abstraite définissant une période comprise entre deux dates.
    """

    class Meta:
        abstract = True

    datebegin = models.DateTimeField(verbose_name="Début", default=timezone.now())

Mais j'ai toujours un message d'erreur (différent, mais quand même) :

WARNINGS:
planning.Event.datebegin: (fields.W161) Fixed default value provided.
	HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`
J'ai fait comme tu m'as conseillé (du moins, comme je l'ai compris) : ``` from django.utils import timezone … … … class Temporizable(models.Model): """ Classe abstraite définissant une période comprise entre deux dates. """ class Meta: abstract = True datebegin = models.DateTimeField(verbose_name="Début", default=timezone.now()) ``` Mais j'ai toujours un message d'erreur (différent, mais quand même) : ``` WARNINGS: planning.Event.datebegin: (fields.W161) Fixed default value provided. HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now` ```
Collaborator

Si tu mets default=timezone.now(), la valeur par défaut va être évaluée au démarrage de l'application, càd quand le worker va être instancié, et pas quand la classe sera instanciée.

Pour que la valeur par défaut soit évaluée au moment de l'instanciation de la classe, tu dois mettre timezone.now comme valeur par défaut, et pas timezone.now().

timezone.now est une fonction, tandis que timezone.now() est une date.

Si tu mets `default=timezone.now()`, la valeur par défaut va être évaluée au démarrage de l'application, càd quand le worker va être instancié, et pas quand la classe sera instanciée. Pour que la valeur par défaut soit évaluée au moment de l'instanciation de la classe, tu dois mettre `timezone.now` comme valeur par défaut, et pas `timezone.now()`. `timezone.now` est une fonction, tandis que `timezone.now()` est une date.
Author
Owner

C'est réglé.

C'est réglé.
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Sulley/Ultron#3
No description provided.