2012-07-04 8 views
15

私はMySQLデータベースを持っていますが、今はすべてのdatetimeフィールドをmodels.DateTimeFieldとして生成しています。代わりにtimestampを取得する方法はありますか?djangoのタイムスタンプフィールド

djangoのドキュメントにはこれはありませんか?

答えて

15

これについては、実際には非常に有益な記事がありました。ここで: http://ianrolfe.livejournal.com/36017.html

ページの溶液がわずか廃止されましたので、私は次のようでした:

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

それを使用するには、あなたがしなければならないすべては、次のとおりです。MySQLで timestamp = UnixTimestampField(auto_created=True)

、列は次のように表示されます。 'timestamp' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

これは、MySQLデータベースでのみ機能するという欠点があります。しかし、あなたは他人のためにそれを簡単に変更することができます。

+2

を参照してください。 MySQLの CoreDumpError

+0

django 1.8の場合、from_db_valueを実装してデータベース値をオブジェクトの属性に変換する必要があります。 –

0

pipパッケージdjango-unixdatetimefieldには、このすぐに使用できるUnixDateTimeFieldフィールドが用意されています(https://pypi.python.org/pypi/django-unixdatetimefield/)。

例モデル:

from django_unixdatetimefield import UnixDateTimeField 

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

PythonのORMクエリ:

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

データベース: - https://github.com/Niklas9/django-unixdatetimefield

sqlite> select created_at from mymodel; 
1426967129 

ここで興味を持っている場合、ソースコードです。

免責事項:私はこのpipパッケージの著者です。

+1

__NULL__などのオプションがありますか? – KVISH

+0

それはDjangoの標準DateTimeFieldをサブクラス化します.DjangoはNULLをサポートします。コード行8を参照してください。 - https://github.com/Niklas9/django-unixdatetimefield/blob/master/django_unixdatetimefield/fields.py – Niklas9

2

が自動的に挿入および更新の使用この上で更新するには:DateTimeField型はUTCは保存する必要があります

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

(あなたのDBの設定を確認し、私はそこにそれがある場合はPostgresから知っています)。

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

は、Unixエポックからの秒数

:あなたは経由して、テンプレートやフォーマットで l10nを使用することができます

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

をそれだけに適用される `get_db_prep_value`機能は、古くなっているhttps://docs.djangoproject.com/en/1.10/ref/templates/builtins/#date

関連する問題