today example datetimefield created python django

python - example - django timezone today



Problemas con la fecha y hora de Django(predeterminado=datetime.now()) (8)

Tengo tal modelo de db:

from datetime import datetime class TermPayment(models.Model): # cut out some fields, non relevant to the question date = models.DateTimeField(default=datetime.now(), blank=True)

Y cuando se agrega una nueva instancia:

tp = TermPayment.objects.create(**kwargs)

Tengo un problema: todos los registros en la base de datos tienen el mismo valor en el campo de fecha: la fecha del primer pago. Después del reinicio del servidor: un registro tiene una nueva fecha y otros tienen el mismo que el primero. Parece que se usa algún caché de datos pero no puedo encontrar dónde.

base de datos: mysql 5.1.25

django v1.1.1


David tuvo la respuesta correcta. El paréntesis () hace que se llame a la zona horaria llamable.now () cada vez que se evalúa el modelo. Si elimina el () de timezone.now () (o datetime.now (), si usa el objeto ingenuo de datetime) para hacerlo simplemente esto:

default=timezone.now

Entonces funcionará como esperas
Los nuevos objetos recibirán la fecha actual cuando se crean, pero la fecha no se anulará cada vez que administre.py makemigrations / migrate.

Acabo de encontrar esto. Muchas gracias a David.


De la documentation en el campo por defecto del modelo de django:

El valor predeterminado para el campo. Esto puede ser un valor o un objeto llamable. Si se puede llamar, se llamará cada vez que se cree un nuevo objeto.

Por lo tanto lo siguiente debería funcionar:

date = models.DateTimeField(default=datetime.now,blank=True)


Desde la referencia del lenguaje Python, en Definiciones de funciones :

Los valores predeterminados de los parámetros se evalúan cuando se ejecuta la definición de la función. Esto significa que la expresión se evalúa una vez, cuando se define la función, y que se utiliza el mismo valor "precalculado" para cada llamada.

Afortunadamente, Django tiene una forma de hacer lo que quieres, si usas el argumento auto_now para el DateTimeField :

date = models.DateTimeField(auto_now=True)

Ver los documentos de Django para DateTimeField .


El datetime.now() se evalúa cuando se crea la clase, no cuando se agrega un nuevo registro a la base de datos.

Para lograr lo que quieres define este campo como:

date = models.DateTimeField(auto_now_add=True)

De esta manera, el campo de date se establecerá en la fecha actual para cada nuevo registro.


En lugar de usar datetime.now , debería utilizar realmente from django.utils.timezone import now

Referencia:


La respuesta a esta pregunta es realmente incorrecta.

Completar automáticamente el valor (auto_now / auto_now_add no es el mismo que el predeterminado). El valor predeterminado será realmente lo que el usuario ve si es un objeto nuevo. Lo que normalmente hago es:

date = models.DateTimeField(default=datetime.now, editable=False,)

Asegúrese de que, si intenta representar esto en una página de administración, lo incluya como ''read_only'' y haga referencia al nombre del campo

read_only = ''date''

Nuevamente, hago esto porque mi valor predeterminado no suele ser editable, y las páginas de administración ignoran los elementos no editables a menos que se especifique lo contrario. Sin embargo, hay una diferencia entre establecer un valor predeterminado e implementar el auto_add, que es la clave aquí. ¡Pruébalo!


Parece que se está evaluando datetime.now() cuando se define el modelo, y no cada vez que se agrega un registro.

Django tiene una característica para lograr lo que estás tratando de hacer:

date = models.DateTimeField(auto_now_add=True, blank=True)

o

date = models.DateTimeField(default=datetime.now, blank=True)

La diferencia entre el segundo ejemplo y lo que tienes actualmente es la falta de paréntesis. Al pasar datetime.now sin los paréntesis, se pasa la función real, que se llamará cada vez que se agregue un registro. Si lo pasa datetime.now() , entonces solo está evaluando la función y pasándole el valor de retorno.

Más información está disponible en el modelo de referencia de Django.


datetime.now() se evalúa una vez, cuando se crea una instancia de su clase. Intente eliminar los paréntesis para que se devuelva la función datetime.now y luego se evalúe. Tuve el mismo problema con la configuración de valores predeterminados para mis DateTimeField y escribí mi solución here .