5

MySQL 5.6.4 以降では、TIME、DATETIME、および TIMESTAMP 値の小数秒のサポートが拡張され、最大でマイクロ秒 (6 桁) の精度になります: http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds .html

Django 1.5 以降は、入力形式として小数秒をサポートしています: https://docs.djangoproject.com/en/1.5/ref/settings/#datetime-input-formats

しかし、DATETIME(6) フィールドはまだ Django に実装されていません。 https://code.djangoproject.com/ticket/19716

カスタムの DateTimeFractionField を作成することにしました。これは、DATETIME([1-6]) db_type を持つ標準の DateTimeField です。「精度」は、ミリ秒、マイクロ秒、またはその他の小数の精度を設定することです。

class DateTimeFractionField(models.DateTimeField):
    description = "Datetimefield with fraction second."

    def __init__(self, precision, *args, **kwargs):
        self.precision = precision
        super(DateTimeFractionField, self).__init__(*args, **kwargs)

    def db_type(self, connection):
        return 'DATETIME(%s)' % self.precision


class MyModel(models.Model):
    dt_micros  = DateTimeFractionField(6)
    dt_millis = DateTimeFractionField(3)
    dt = models.DateTimeField()

    def __unicode__(self):
        return "%s - %s" %(self.dt_micros, self.dt_millis)

mysql バックエンドは、ミリ秒を 0 に置き換える責任があります。Django のドキュメントでは、独自のバックエンドを作成するよう提案されています。https://docs.djangoproject.com/en/1.5/ref/settings/#engine

私はハッキングしました:

$ cd /path/to/site-packages/django/db/backends/
$ cp -r mysql mysql564

そして変更された mysql564/base.py:

ライン 42:45

from django.db.backends.mysql564.client import DatabaseClient
from django.db.backends.mysql564.creation import DatabaseCreation
from django.db.backends.mysql564.introspection import DatabaseIntrospection
from django.db.backends.mysql564.validation import DatabaseValidation

167行目

supports_microsecond_precision = True

214号線

compiler_module = "django.db.backends.mysql564.compiler"

357行目

return six.text_type(value) #value.replace(microsecond=0)

368行目

return six.text_type(value) #value.replace(microsecond=0)

373行目

return [first, second] #return [first.replace(microsecond=0), second.replace(microsecond=0)]

次に、settings.py で新しいバックエンドを有効にしました。

'ENGINE': 'django.db.backends.mysql564',

モデルを管理者に追加して保存すると、値がデータベースに保存されます! :)

続編プロ

ただし、それらは返されません (なし - なしおよび空のフォーム フィールド)。:(

ジャンゴ管理者

ここで何が欠けていますか?

  1. DateTimeFractionField 値が返されないのはなぜですか?
  2. 分数をサポートする datetimefield を実装するためのより良い (より簡単な) 方法はありますか?

他のデータベースのサポート分数があることは知っています。しかし、私は MySQL を使用してチケットを修正に少し近づけたいと思っています。

アップデート:

これはフォームではなく (のみ)、de db からの日時オブジェクトの取得に失敗します。

In [1]: from spacetime.models import MyModel

In [2]: from django.shortcuts import get_object_or_404

In [3]: get_object_or_404(MyModel, pk=1).dt
Out[3]: datetime.datetime(2013, 7, 25, 0, 22, 23)

In [4]: get_object_or_404(MyModel, pk=1).dt_millis

In [5]: get_object_or_404(MyModel, pk=1).dt_millis.__class__
Out[5]: NoneType #This should be datetime.datetime
4

1 に答える 1