21 votes

Champs d'horodatage dans django

J'ai une base de données MySQL. Actuellement, je génère tous les champs de date sous la forme suivante models.DateTimeField . Y a-t-il un moyen d'obtenir un timestamp à la place ? Je veux pouvoir effectuer une mise à jour automatique lors de la création et de la mise à jour, etc.

La documentation sur django n'en parle pas ?

22voto

KVISH Points 1826

Il y avait en fait un article très bon et informatif sur ce sujet. Ici : http://ianrolfe.livejournal.com/36017.html

La solution proposée sur la page est légèrement obsolète, j'ai donc fait ce qui suit :

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())

Pour l'utiliser, il suffit de : timestamp = UnixTimestampField(auto_created=True)

Dans MySQL, la colonne devrait apparaître comme suit : 'timestamp' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

Le seul inconvénient de ce système est qu'il ne fonctionne que sur les bases de données MySQL. Mais vous pouvez facilement le modifier pour d'autres.

4voto

Risadinha Points 1254

Pour mettre automatiquement à jour lors de l'insertion et de la mise à jour, utilisez ceci :

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

Le champ DateTimeField devrait stocker UTC (vérifiez les paramètres de votre DB, je sais par Postgres que c'est le cas). Vous pouvez utiliser l10n dans les modèles et le format via :

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

Secondes depuis l'époque Unix :

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

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

3voto

Niklas9 Points 850

Le paquet pip django-unixdatetimefield fournit un champ UnixDateTimeField que vous pouvez utiliser pour cela dès le départ ( https://pypi.python.org/pypi/django-unixdatetimefield/ ).

Exemple de modèle :

from django_unixdatetimefield import UnixDateTimeField

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

Requête ORM Python :

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

Base de données :

sqlite> select created_at from mymodel;
1426967129

Voici le code source si cela vous intéresse - https://github.com/Niklas9/django-unixdatetimefield .

Disclaimer : Je suis l'auteur de ce paquet de pip.

0voto

blueyed Points 7719

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X