Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建Django自定义字段来存储MYSQL日期时间(6)并在Django/MYSQL中启用小数秒(毫秒和或微秒)?_Django_Django Forms_Django Admin_Django Orm_Django Database - Fatal编程技术网

如何创建Django自定义字段来存储MYSQL日期时间(6)并在Django/MYSQL中启用小数秒(毫秒和或微秒)?

如何创建Django自定义字段来存储MYSQL日期时间(6)并在Django/MYSQL中启用小数秒(毫秒和或微秒)?,django,django-forms,django-admin,django-orm,django-database,Django,Django Forms,Django Admin,Django Orm,Django Database,MySQL 5.6.4及更高版本扩展了对时间、日期时间和时间戳值的分数秒支持,精度高达微秒(6位): Django 1.5及以上版本支持分数秒作为输入格式: 但是DATETIME(6)字段还没有在Django中实现。 我决定写一个自定义DateTimeFractionField。它是带有DATETIME([1-6])db_类型的标准DATETIME字段“精度”是设置毫秒、微秒或任何其他分数精度 class DateTimeFractionField(models.DateTimeField):

MySQL 5.6.4及更高版本扩展了对时间、日期时间和时间戳值的分数秒支持,精度高达微秒(6位):

Django 1.5及以上版本支持分数秒作为输入格式:

但是DATETIME(6)字段还没有在Django中实现。

我决定写一个自定义DateTimeFractionField。它是带有DATETIME([1-6])db_类型的标准DATETIME字段“精度”是设置毫秒、微秒或任何其他分数精度

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文档建议编写自己的后端

我黑了:

$ 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',
当我在admin中添加并保存模型时,这些值会保存到de db!:)

但它们不会返回(None-None和空表单字段):(

我错过了什么

  • 为什么不返回DateTimeFractionField值
  • 有没有更好(更简单)的方法来实现支持分数的datetimefield
  • 我知道还有其他db的支持分数。但是我喜欢使用MySQL,让票证更接近于修复

    更新:

    不仅仅是表单,从de db获取datetime对象失败

    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
    

    我已经成功地尝试过了,但我的方法完全不同: 我将信息拆分为日期时间字段(UTC)和整数字段(微秒=uS):

    然后我在类中设置了一个属性,以返回UTC,并带有微秒和区域信息感知(因为我的数据库不支持zoneinfo)


    也许只有我一个人,但看到你实际要求/试图做什么有点让人困惑。我尝试创建一个支持分数秒的DateTimeField。我的自定义DateTimeField是DateTimeFractionField。它成功地将带有分数的datetime对象保存到db中,但从db到Django的值不起作用。总体目标是o获取一个有效的DateTimeFractionField字段。目前的问题是:为什么DateTimeFractionField值没有返回?据我所知,Django不支持开箱即用,因为SQL实际上没有对它的规范。您可以使用CharField,或者编写自己的使用数据库特定代码的字段。谢谢您的评论。show这就是可以做的。CharField实际上不是一个选项。不可能查询像datetime字段这样的char字段。我的问题提供了一个自定义字段和一个自定义db后端来处理微秒(应该可以工作)。我想db接口(MySQLdb)出了问题.Nice。我将尝试一下。Django 1.8将支持分数:请注意@property字段不适用于筛选查询(MyModel.objects.filter(UTC…)。为此,需要分别按UTC和/或UTC进行筛选
    from datetime                   import datetime, timedelta
    import pytz
    
    class MyModel (models.Model):
        # My model stuff and other fields here
        _UTC = models.DateTimeField ()
        _uS  = models.IntegerField()
    
        @property
        def UTC (self): 
            utc = self._UTC
            us  = self._uS
            # add microseconds
            utc += timedelta(microseconds=us)
            return utc.replace(tzinfo=pytz.utc)
        @UTC.setter
        def UTC (self,utc):
            self._UTC = utc-timedelta(microseconds=utc.microsecond) # without microseconds
            self._uS = utc.microsecond