2012-07-04 19 views
15

Mam bazę danych MySQL, teraz generuję wszystkie pola datetime jako models.DateTimeField. Czy istnieje sposób, aby zamiast tego uzyskać timestamp? Chcę mieć możliwość automatycznego aktualizowania na tworzenie i aktualizowanie itp.Pola datownika w django

Dokumentacja na Django tego nie ma?

Odpowiedz

15

W rzeczywistości był to bardzo dobry i pouczający artykuł na ten temat. Tutaj: http://ianrolfe.livejournal.com/36017.html

Rozwiązanie na stronie jest nieco przestarzała, więc robiłam następujące:

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

Aby go użyć, wszystko co musisz zrobić, to: timestamp = UnixTimestampField(auto_created=True)

W MySQL kolumna powinna wyglądać następująco: 'timestamp' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

Jedyną wadą jest to, że działa tylko w bazach danych MySQL. Można go jednak łatwo modyfikować dla innych.

+2

Opcja 'funkcja get_db_prep_value' jest nieaktualny, ponieważ odnosi się tylko do Kolumny "TIMESTAMP" w MySQL <4.1. Dla współczesnych wersji MySQL użyj '% Y%% m% d% H:% M:% S'' zamiast'% Y% m% d% H% M% S''. – CoreDumpError

+0

Dla django 1.8 należy zaimplementować wartość from_db_value, aby przekonwertować wartość bazy danych na atrybut obiektu. –

0

Pakiet pip django-unixdatetimefield udostępnia pole UnixDateTimeField, którego można użyć do tego po wyjęciu z pudełka (https://pypi.python.org/pypi/django-unixdatetimefield/).

Przykład model:

from django_unixdatetimefield import UnixDateTimeField 

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

Python ORM kwerendy:

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

Baza:

sqlite> select created_at from mymodel; 
1426967129 

Oto kod źródłowy, jeśli zainteresowany - https://github.com/Niklas9/django-unixdatetimefield.

Nota prawna: Jestem autorem tego pakietu pip.

+1

czy ma opcje dla __NULL__ itp? – KVISH

+0

ma, podklasy standardowego DateTimeField w Django, który z kolei obsługuje NULL itp. Zobacz wiersz kodu 8 na - https://github.com/Niklas9/django-unixdatetimefield/blob/master/django_unixdatetimefield/fields.py – Niklas9

2

Aby automatycznie aktualizować na wkładce i stosowania tej aktualizacji:

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

DateTimeField należy przechowywać UTC (sprawdź ustawienia DB, wiem z PostgreSQL, że tam jest). Można użyć l10n w szablonach i format poprzez:

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

sekund od epoki Uniksa:

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

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