2012-07-04 27 views
15

Tengo una base de datos MySQL, ahora mismo estoy generando todos los campos de fecha y hora como models.DateTimeField. ¿Hay alguna forma de obtener un timestamp? Quiero ser capaz de realizar una actualización automática al crear y actualizar, etc.Campos de marca de tiempo en django

La documentación sobre django no tiene esto?

Respuesta

15

Hubo un artículo muy bueno e informativo sobre esto. Aquí: http://ianrolfe.livejournal.com/36017.html

La solución en la página está un poco obsoleto, así que hizo lo siguiente:

from django.db import models 
from datetime import datetime 
from time import strftime 

class UnixTimestampField(models.DateTimeField): 
    """UnixTimestampField: creates a DateTimeField that is represented on the 
    database as a TIMESTAMP field rather than the usual DATETIME field. 
    """ 
    def __init__(self, null=False, blank=False, **kwargs): 
     super(UnixTimestampField, self).__init__(**kwargs) 
     # default for TIMESTAMP is NOT NULL unlike most fields, so we have to 
     # cheat a little: 
     self.blank, self.isnull = blank, null 
     self.null = True # To prevent the framework from shoving in "not null". 

    def db_type(self, connection): 
     typ=['TIMESTAMP'] 
     # See above! 
     if self.isnull: 
      typ += ['NULL'] 
     if self.auto_created: 
      typ += ['default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'] 
     return ' '.join(typ) 

    def to_python(self, value): 
     if isinstance(value, int): 
      return datetime.fromtimestamp(value) 
     else: 
      return models.DateTimeField.to_python(self, value) 

    def get_db_prep_value(self, value, connection, prepared=False): 
     if value==None: 
      return None 
     # Use '%Y%m%d%H%M%S' for MySQL < 4.1 
     return strftime('%Y-%m-%d %H:%M:%S',value.timetuple()) 

Para usarlo, todo lo que tiene que hacer es: timestamp = UnixTimestampField(auto_created=True)

En MySQL, la columna debería aparecer como: 'timestamp' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

La única desventaja de esto es que solo funciona en bases de datos MySQL. Pero puedes modificarlo fácilmente para otros.

+2

La función 'get_db_prep_value' no está actualizado, ya que sólo se aplica a las Columnas 'TIMESTAMP' en MySQL <4.1. Para las versiones modernas de MySQL use ''% Y-% m-% d% H:% M:% S'' en lugar de''% Y% m% d% H% M% S''. – CoreDumpError

+0

Para django 1.8, debe implementar from_db_value para convertir el valor de la base de datos al atributo de su objeto. –

0

El paquete pip django-unixdatetimefield proporciona un campo UnixDateTimeField que puede usar para esto de fábrica (https://pypi.python.org/pypi/django-unixdatetimefield/).

Ejemplo modelo:

from django_unixdatetimefield import UnixDateTimeField 

class MyModel(models.Model): 
    created_at = UnixDateTimeField() 

Python ORM consulta:

>>> m = MyModel() 
>>> m.created_at = datetime.datetime(2015, 2, 21, 19, 38, 32, 209148) 
>>> m.save() 

Base de datos:

sqlite> select created_at from mymodel; 
1426967129 

Aquí está el código fuente si está interesado - https://github.com/Niklas9/django-unixdatetimefield.

Descargo de responsabilidad: soy el autor de este paquete pip.

+1

¿tiene opciones para __NULL__, etc.? – KVISH

+0

, subclasifica el estándar DateTimeField en Django, que a su vez admite NULL, etc. Consulte la línea de código 8 en https://github.com/Niklas9/django-unixdatetimefield/blob/master/django_unixdatetimefield/fields.py – Niklas9

2

para actualizar automáticamente la actualización en el uso de inserción y esto:

created = DateTimeField(auto_now_add=True, editable=False, null=False, blank=False) 
last_modified = DateTimeField(auto_now=True, editable=False, null=False, blank=False) 

El DateTimeField debe almacenar UTC (compruebe la configuración de DB, sé por Postgres que no es el caso). Puede utilizar l10n en las plantillas y el formato a través de:

{{ object.created|date:'SHORT_DATETIME_FORMAT' }} 

segundos desde el Epoch Unix:

{{ object.created|date:'U' }} 

Ver https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#date

Cuestiones relacionadas