I'm using legacy db schema in Django admin. My datetime fields are varchar(14) saving this format: YYYYmmddHHiiss.
I want that these type of "datetime" fields have similar behaviour to common datetime fields in django templates. (I mean, date/time widgets can understand the data).
I have created this custom DateTime class:
# 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)
It is not working good. Because even though it looks good, when I recover the data the widgets understand it while trying to save it I got this error:
return value.utcoffset() is not None AttributeError: 'str' object has no attribute 'utcoffset'
This error is raised by this line: value = u.get_strdatetime(value) #<-- bug here Because I'm trying to store a string value in a "datetime" field.
If I remove the overriding of get_prep_value method, I got no errors, but the saving value is wrong:
I have tried overriding a lot of crud methods without success.
This is the files stack with involved methods on a change action:
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
I would like to save 20190518105449 and not 2019-05-18 10: