Сохранить тип поля модели Datetime как varchar в ггггммддхисс - PullRequest
0 голосов
/ 19 мая 2019

Я использую устаревшую схему БД в Django admin.Мои поля даты и времени - это varchar (14), сохраняющий этот формат: ГГГГммддHHiiss.

Я хочу, чтобы эти типы полей «дата / время» имели поведение, аналогичное обычным полям даты и времени в шаблонах 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 Поскольку я пытаюсь сохранить строковое значение в поле «datetime».

Если я удалю переопределение метода get_prep_value , я не получу ошибок, но сохраняемое значениенеправильно:

ошибка в формате-сохранении

Я попытался переопределить многие методы crud без успеха.

Это стек файлов с участиемСпособы изменения действия:

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:

...