防止Django解析不正确的TIMESTAMP字段

时间:2016-08-09 16:27:49

标签: python django sqlite

我有一个类似于:

的sqlite数据库(来自iOS应用程序)
CREATE TABLE ZSPL ( Z_PK INTEGER PRIMARY KEY, ZWHEN TIMESTAMP, ZWHEN2 real)

1, 492445270.121238, 492445270.121238
2, 492445270.871551, 492445270.871551

我希望构建一个Django(v1.10)模型来使用它following these docs

APPLE_EPOCH = datetime(year=2001, month=1, day=1, hour=0, second=0)


def apple_time_to_datetime(apple_time):
  if isinstance(apple_time, datetime):
      return apple_time
  return APPLE_EPOCH + timedelta(seconds=float(apple_time))


class AppleDateTimeField(models.DateTimeField):
    def from_db_value(self, value, expression, connection, context):
        return apple_time_to_datetime(value)

    def to_python(self, value):
        return apple_time_to_datetime(value)

class Spl(models.Model):
    when = AppleDateTimeField(db_column='ZWHEN')

但是,由于转化器here注册的parse_datetime尝试解析ZWHEN中的数值,因此出现此错误。如果这些转换器已注释掉,那么dbapi2 convert_timestamp函数here上会出现错误。

同样,当db_column='ZWHEN'更改为db_column='ZWHEN2'时,由于日期转换器在自定义转换器之前注册,因此会出错。您可以在this line上的conv值中看到此内容。

我想知道是否还有解决此问题并且首先调用自定义from_db_value转换器?

我暂时使用复制的ZWHEN2代替ZWHEN字段并编辑get_converters函数来阅读:

converters[i] = (field_converters + backend_converters, expression)

而不是:

converters[i] = (backend_converters + field_converters, expression)

1 个答案:

答案 0 :(得分:0)

这不是我正在寻找的答案,因为它涉及对Django库的更改,但至少它不涉及编辑源代码本身。

在与模型相同的文件中,我添加了以下行:

from django.db.backends.sqlite3.base import Database, decoder

Database.register_converter(str("timestamp"), decoder(apple_time_to_datetime))
Database.register_converter(str("TIMESTAMP"), decoder(apple_time_to_datetime))

似乎已经解决了#34;问题。