es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TypeError: El objeto ‘_SentinelObject’ no es llamable

Estoy actualizando mi aplicación Django de la versión 2.2 a la versión 3.2. Mientras estoy actualizando, me encuentro con el siguiente problema, he dedicado mucho tiempo a resolverlo pero aún no encuentro ninguna solución.

Aquí está el rastreo del problema que estoy enfrentando:

Traceback (most recent call last):
  File ".../abc/test.py", line 85, in setUp
    self.MODEL_A.save()
  File ".../abc/models.py", line 470, in save
    super(MODEL_A, self).save(*args, **kwargs)
  File ".../lib/python3.8/site-packages/django/db/models/base.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File ".../lib/python3.8/site-packages/django/db/models/base.py", line 763, in save_base
    updated = self._save_table(
  File ".../lib/python3.8/site-packages/django/db/models/base.py", line 842, in _save_table
    values = [(f, None, (getattr(self, f.attname) if raw else f.pre_save(self, False)))
  File ".../lib/python3.8/site-packages/django/db/models/base.py", line 842, in <listcomp>
    values = [(f, None, (getattr(self, f.attname) if raw else f.pre_save(self, False)))
  File ".../lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 1396, in pre_save
    value = timezone.now()
TypeError: El objeto '_SentinelObject' no es llamable

Cualquier ayuda sería muy apreciada.

Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás enfrentando al actualizar tu aplicación Django de la versión 2.2 a la 3.2 está relacionado con la función pre_save en el módulo django.db.models.fields. Específicamente, parece que la función timezone.now() está lanzando un TypeError que indica que un objeto de tipo _SentinelObject no es llamable.

    Este error probablemente está ocurriendo porque _SentinelObject es un objeto centinela especial utilizado como marcador de posición en algunas partes del código de Django, y es posible que los cambios en la base de código de Django 3.2 hayan provocado que este objeto se use en un contexto donde no se espera.

    Para resolver este problema, podrías intentar actualizar tu código para usar explícitamente el módulo timezone en lugar de confiar en la función pre_save de Django para establecer la marca de tiempo. Por ejemplo, podrías actualizar tu archivo models.py para incluir la siguiente declaración de importación al principio:

    from django.utils import timezone
    

    Y luego actualizar tu función save para establecer la marca de tiempo usando timezone.now() directamente, de la siguiente manera:

    class MODEL_A(models.Model):
        ...
        def save(self, *args, **kwargs):
            self.timestamp = timezone.now()
            super().save(*args, **kwargs)
        ...
    

    Esto debería resolver el problema que estás enfrentando y permitirte continuar con la actualización de tu aplicación Django.

Comments are closed.