Python TypeError: Обязательный аргумент 'offset' (поз. 1) не найден - PullRequest
1 голос
/ 13 апреля 2019

Я получаю сообщение об ошибке TypeError: Required argument 'offset' (pos 1) not found, когда я создаю экземпляр класса моделей формы объекта: users подобно a = users() у этого класса есть динамические атрибуты, созданные из списка service_data с использованием функции vars().

 class users(models.Model):
      for i, j in zip(config.service_data[0], config.service_data[1]):
          vars()[i] = CrudAPI.create_db_field(j)

А это код метода create_db_field:

def create_db_field(test):
      if (test == "char50"):
          return models.CharField(max_length=50, blank=True)
      if (test == "text"):
          return models.TextField(blank=True)
      if (test == "date"):
          return models.DateField(blank=True)
      if (test == "datetime"):
          return models.DateTimeField(default=datetime.timezone, blank=True)
      if (test == "number"):
          return models.FloatField(blank=True)

, и это мой список, используемый для динамического создания этих атрибутов:

service_data=[["username","password"],[],["email","password"]]

tarting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[13/Apr/2019 11:33:59] "GET / HTTP/1.1" 200 17234
[13/Apr/2019 11:34:02] "GET /login/ HTTP/1.1" 200 1382
True
Internal Server Error: /login_/
Traceback (most recent call last):
  File "F:\softs\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "F:\softs\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "F:\softs\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "F:\projects\PycharmProjects\roottic\root\views.py", line 61, in login_
    a = users()
  File "F:\softs\Anaconda3\lib\site-packages\django\db\models\base.py", line 459, in __init__
    val = field.get_default()
  File "F:\softs\Anaconda3\lib\site-packages\django\db\models\fields\__init__.py", line 798, in get_default
    return self._get_default()
TypeError: Required argument 'offset' (pos 1) not found
[13/Apr/2019 11:34:04] "POST /login_/ HTTP/1.1" 500 75786

Iне понимаю, что с ним не так

1 Ответ

1 голос
/ 13 апреля 2019

В вашем методе create_db_field вы определяете опцию для «datetime» как возвращающую DateTimeField со значением по умолчанию datetime.timezone. Это то, что будет вызываться при создании нового экземпляра users без установки этого поля. Но timezone() - это функция, которая ожидает параметр offset, который вы не передаете.

Я подозреваю, что вы не хотели использовать эту функцию из стандартного модуля datetime, а вместо этого функцию Django timezone.now:

from django.utils import timezone
...

    return models.DateTimeField(default=timezone.now, blank=True)

(Должен сказать, что, независимо от вашей ошибки, это очень странная вещь; в чем смысл? Модели Django отражают таблицы в базах данных, зачем пытаться определять их динамически?)

...