определение поля для текущего года в web2py с использованием datetime - PullRequest
0 голосов
/ 26 апреля 2018

Я совершенно новичок в Web2Py, и у меня возникла следующая проблема:

Я пытаюсь определить базу данных и указать текущий год в качестве поля, которое должно быть автоматически заполнено с использованием даты и времени.

Но когда я пытаюсь открыть базу данных и просмотреть записи, я получаю обратный ответ, которого я не понимаю (см. Ниже).

Редактировать: Я думаю, что это связано с тем, что strftime имеет только один аргумент.Когда я использую strftime ("% Y% m% d"), он работает отлично.Но мне действительно нужен только текущий год.

Спасибо

Код

import datetime

       db.define_table('orders',            
                    Field("current_year", "string",default=datetime.datetime.now().strftime("%Y"),Label=T('Current Year'), readable=True, writable=False))

Код с использованием IS_DATETIME

После прочтения документации web2py я также попробовал это:

import datetime

Поле ('current_year', 'string', label = T («Текущий год»), по умолчанию = IS_DATETIME (формат = T («% Y»)), читаемый = True, доступный для записи = False))

Отслеживание:

Трассировка (последний вызов был последним): Файл "/home/PyCatUB/web2py/applications/contacts/controllers/appadmin.py", строка 269, в полях select *, limitby = (start, stop)) File "/ home / PyCatUB/web2py/gluon/packages/dal/pydal/objects.py ", строка 2020, в файле select return adapter.select (self.query, fields, attribute) Файл" / home / PyCatUB / web2py / gluon / packages / dal / pydal/adapters/sqlite.py ", строка 123, в select return super (SQLiteAdapter, self) .select (запрос, поля, атрибуты) Файл" / home / PyCatUB / web2py / gluon / packages / dal / pydal / adapters / base.py ", строка 1296, в select вернуть self._select_aux (sql, fields, attribute) Файл "/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/base.py", строка 1253, в файле _select_aux self.execute (sql)«/home/PyCatUB/web2py/gluon/packages/dal/pydal/adapters/base.py», строка 1388, в файле «выполнить самовывоз», файл self.log_execute (* a, ** b) »/ home / PyCatUB / web2py / gluon/packages/dal/pydal/adapters/base.py ", строка 1382, в log_execute ret = self.get_cursor (). execute (команда, * a [1:], ** b) файл" / usr / lib / python2.7 / sqlite3 / dbapi2.py ", строка 66, в convert_timestamp datepart, timepart = val.split (" ") ValueError: для распаковки требуется более 1 значения

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018
Field('current_year', 'string', label=T('Current Year'),
      default=IS_DATETIME(format=T('%Y')),
      readable=True, writable=False))

Выше IS_DATETIME является валидатором.Он предназначен для использования с атрибутом requires поля.Вы не можете использовать его с атрибутом default.В этом случае, когда вы делаете вставку, он просто вставляет строковое представление этого объекта валидатора, которое будет выглядеть примерно как '<gluon.validators.IS_DATETIME object at 0x000002202AC13CC0>'.Эта строка, очевидно, не является допустимой строкой даты и времени, поэтому вы получаете исключение, когда dbapi2.py пытается проанализировать ее как метку времени.

Если вы хотите сохранить только год, возможно, лучше использовать простоцелочисленный тип и сохраните только год как целое число:

Field('current_year', 'integer', default=request.now.year)

Как отмечено в комментарии выше, SQLite не позволяет вам менять тип существующего поля, поэтому, если вы хотите использовать имя«current_year» для поля, сначала удалите существующую таблицу и дайте web2py заново создать ее с новым типом поля.

0 голосов
/ 26 апреля 2018

Похоже, я это исправил.По какой-то причине web2py не понравился тег «current_year».Я изменил это на «curyear», потому что у меня было ощущение, что current_year может быть зарезервированным словом - и это сработало.Может ли это быть причиной?

...