21

私はMySQLデータベースを持っていますが、現在、すべての日時フィールドをとして生成していmodels.DateTimeFieldます。timestamp代わりに入手する方法はありますか?作成や更新などで自動更新できるようにしたい。

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

4

4 に答える 4

22

実際、これについては非常に有益で有益な記事がありました。ここ: 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データベースでのみ機能することです。ただし、他の人のために簡単に変更できます。

于 2012-07-04T15:43:28.600 に答える
4

挿入および更新時に自動的に更新するには、次を使用します。

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を格納する必要があります(DB設定を確認してください。Postgresからその場合があることがわかります)。l10nテンプレートで使用し、次の方法でフォーマットできます。

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

Unixエポックからの秒数:

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

https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#dateを参照してください

于 2016-10-28T09:27:25.083 に答える
3

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パッケージの作成者です。

于 2016-01-17T21:23:46.190 に答える
1

django-extensionsには便利なものがありますTimeStampedModelhttps ://django-extensions.readthedocs.io/en/latest/model_extensions.html

于 2019-12-26T16:32:28.803 に答える