我有一個MySQL數據庫,現在我生成所有的日期時間字段爲models.DateTimeField
。有沒有辦法得到timestamp
而不是?我希望能夠創建和更新等自動更新等。django中的時間戳字段
django的文檔沒有這個?
我有一個MySQL數據庫,現在我生成所有的日期時間字段爲models.DateTimeField
。有沒有辦法得到timestamp
而不是?我希望能夠創建和更新等自動更新等。django中的時間戳字段
django的文檔沒有這個?
實際上有一個非常好的和翔實的文章。在這裏: 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())
要使用它,你需要做的是: timestamp = UnixTimestampField(auto_created=True)
在MySQL中,該列應顯示爲: 'timestamp' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
只有缺點是它只能在MySQL數據庫上工作。但您可以輕鬆修改其他人。
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()
數據庫:
sqlite> select created_at from mymodel;
1426967129
這裏的源代碼,如果有興趣 - https://github.com/Niklas9/django-unixdatetimefield。
聲明:我是本pip軟件包的作者。
要在插入和更新使用這種自動更新:
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字段應存儲UTC(檢查你的數據庫的設置,我知道從Postgres的,有它的情況下)。您可以通過使用模板中l10n
和格式:
{{ object.created|date:'SHORT_DATETIME_FORMAT' }}
秒,因爲Unix的時代:
{{ object.created|date:'U' }}
見https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#date
的'get_db_prep_value'功能是過時的,因爲它僅適用於MySQL <4.1上的'TIMESTAMP'列。對於現代版本的MySQL,使用「%Y-%m-%d%H:%M:%S」而不是「%Y%m%d%H%M%S」。 – CoreDumpError
對於django 1.8,您應該實現from_db_value將數據庫值轉換爲您的對象的屬性。 –