首页 > 解决方案 > 在 yyyymmddhhiiss 中将日期时间模型字段类型保存为 varchar

问题描述

我在 Django admin 中使用旧版数据库模式。我的日期时间字段是 varchar(14) 保存这种格式:YYYYmmddHHiiss。

我希望这些类型的“日期时间”字段与 django 模板中的常见日期时间字段具有相似的行为。(我的意思是,日期/时间小部件可以理解数据)。

我创建了这个自定义 DateTime 类:

# module u.py
# some helper functions
def get_objdatetime(strdatetime):
    # strdatetime = "20190102153348"
    strdatetime = strdatetime.replace(" ","").replace("-","").replace(":","")
    if len(strdatetime)<14:
        strdatetime += "0000" #patch
    objdatetimeutc = datetime.strptime(strdatetime,'%Y%m%d%H%M%S')#.strftime('%m/%d/%Y')
    return objdatetimeutc

def get_strdatetime(objdatetime):
    strdatetime = objdatetime.strftime('%Y%m%d%H%M%S')
    return strdatetime


class TheappDatetime(models.DateTimeField):

    def from_db_value(self, value, expression, connection, context):   
        return self.to_python(value)

    def to_python(self, value):
        if value is None:
        elif isinstance(value,str):
            value = u.get_objdatetime(value)
        else:
            value = u.get_strdatetime(value)
        return value

    # métodos al guardar
    def get_prep_value(self, value):
        if value is not None:
            value = u.get_strdatetime(value) #<-- bug here
        return value

    def value_to_string(self, obj):
        value = self.value_from_object(obj)
        return value

    def get_db_prep_value_(self, value, connection, prepared=False):
        if value==None:
            return None
        return u.get_objdatetime(value)

    def get_db_prep_save(self, value, connection, prepared=False):
        if value is not None:
            value = u.get_objdatetime(value)
        return self.get_db_prep_value(value, connection, prepared)

小部件

效果不好。因为即使它看起来不错,当我恢复数据时,小部件在尝试保存它时理解它,我收到了这个错误:

return value.utcoffset() is not None AttributeError: 'str' object has no attribute 'utcoffset'

此行引发了此错误:value = u.get_strdatetime(value) #<-- bug here因为我试图将字符串值存储在“日期时间”字段中。

如果我删除get_prep_value方法的覆盖,我没有错误,但保存值是错误的:

错误格式保存

我已经尝试过覆盖很多杂乱无章的方法,但都没有成功。

这是与更改操作相关的方法的文件堆栈:

File "<v-env>\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "<v-env>\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "<v-env>\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "<v-env>\lib\site-packages\django\contrib\admin\options.py", line 606, in wrapper
return self.admin_site.admin_view(view)(*args, **kwargs)
File "<v-env>\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "<v-env>\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "<v-env>\lib\site-packages\django\contrib\admin\sites.py", line 223, in inner
return view(request, *args, **kwargs)
File "<v-env>\lib\site-packages\django\contrib\admin\options.py", line 1637, in change_view
return self.changeform_view(request, object_id, form_url, extra_context)
File "<v-env>\lib\site-packages\django\utils\decorators.py", line 45, in _wrapper
return bound_method(*args, **kwargs)
File "<v-env>\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "<v-env>\lib\site-packages\django\contrib\admin\options.py", line 1522, in changeform_view
return self._changeform_view(request, object_id, form_url, extra_context)
File "<v-env>\lib\site-packages\django\contrib\admin\options.py", line 1561, in _changeform_view
self.save_model(request, new_object, form, not add)
File "<project>\theapp\admin\sections\admin_theapp.py", line 50, in save_model
super().save_model(request, obj, form, change)
File "<v-env>\lib\site-packages\django\contrib\admin\options.py", line 1088, in save_model
obj.save()
File "<v-env>\lib\site-packages\django\db\models\base.py", line 741, in save
force_update=force_update, update_fields=update_fields)
File "<v-env>\lib\site-packages\django\db\models\base.py", line 779, in save_base
force_update, using, update_fields,
File "<v-env>\lib\site-packages\django\db\models\base.py", line 851, in _save_table
forced_update)
File "<v-env>\lib\site-packages\django\db\models\base.py", line 900, in _do_update
return filtered._update(values) > 0
File "<v-env>\lib\site-packages\django\db\models\query.py", line 760, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
File "<v-env>\lib\site-packages\django\db\models\sql\compiler.py", line 1429, in execute_sql
cursor = super().execute_sql(result_type)
File "<v-env>\lib\site-packages\django\db\models\sql\compiler.py", line 1087, in execute_sql
sql, params = self.as_sql()
File "<v-env>\lib\site-packages\django\db\models\sql\compiler.py", line 1395, in as_sql
val = field.get_db_prep_save(val, connection=self.connection)
File "<project>\theapp\models\fields.py", line 74, in get_db_prep_save
return self.get_db_prep_value(value, connection, prepared)
File "<v-env>\lib\site-packages\django\db\models\fields\__init__.py", line 1430, in get_db_prep_value
return connection.ops.adapt_datetimefield_value(value)
File "<v-env>\lib\site-packages\django\db\backends\mysql\operations.py", line 194, in adapt_datetimefield_value
if timezone.is_aware(value):
File "<v-env>\lib\site-packages\django\utils\timezone.py", line 248, in is_aware
return value.utcoffset() is not None

我想保存 20190518105449 而不是 2019-05-18 10:

标签: pythondjangodatetimebefore-save

解决方案


推荐阅读