Объект типа datetime не является сериализуемой ошибкой JSON - PullRequest
1 голос
/ 03 июня 2019

У меня есть некоторые проблемы с использованием значения DateTime в Python. Когда я использую session_start в следующем коде, я получаю объект типа datetime, не являющийся сериализуемой ошибкой JSON

views.py

    dataSourceBar = {}
    dataSourceBar['chart'] = {
        "caption": "Rainfall",
            "subCaption": "Shown per date",
            "xAxisName": "Session",
            "yAxisName": "Rainfall in MM",
            "theme": "candy"
        }

    dataSourceBar['data'] = []  

    objects_with_category_id_2 = dashboard_input.objects.filter(category_category_id=2)

    for obj in objects_with_category_id_2:
        data =  {'label': obj.session_start,
                 'value': obj.input_input_value}
        dataSourceBar['data'].append(data)  

model.py

class dashboard_input(models.Model):
    session_start = models.DateTimeField(max_length=100)

отслеживающий

Internal Server Error: /dashboard/
Traceback (most recent call last):
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\var\www\VSDK\vsdk\dashboard\views.py", line 69, in Chart
    return  render(request, 'dash.html', {'output' : column2D.render(),'output2' : doughnut3d.render()})
  File "C:\var\www\VSDK\vsdk\dashboard\fusioncharts.py", line 52, in render
    self.readyJson = json.dumps(self.constructorOptions, ensure_ascii=False)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\natas\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type datetime is not JSON serializable

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

Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Как говорится в сообщении об ошибке, объекты datetime не могут быть автоматически преобразованы json в строку или словарь. Похоже, ваша функция просмотра преобразует все в json перед отправкой во внешний интерфейс или в рендеринг.

Все, что вам нужно сделать, это явно преобразовать объект DateTime в строку, чтобы ваш код работал:

for obj in objects_with_category_id_2:
        data =  {'label': str(obj.session_start),
                 'value': obj.input_input_value}
        dataSourceBar['data'].append(data) 

Или используйте встроенные функции из datetime для форматирования. Для формата ISO используйте .isoformat ():

for obj in objects_with_category_id_2:
        data =  {'label': obj.session_start.isoformat(),
                 'value': obj.input_input_value}
        dataSourceBar['data'].append(data) 

Если вы хотите, чтобы дата имела другой формат, вы можете использовать функцию datetime.strftime (format), которая принимает строку, содержащую формат результирующей строки даты. Проверьте документацию пакета datetime: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior

может быть что-то вроде этого:

for obj in objects_with_category_id_2:
        data =  {'label': obj.session_start.strftime("%d.%m.%Y"),
                 'value': obj.input_input_value}
        dataSourceBar['data'].append(data) 

Удачи!

0 голосов
/ 03 июня 2019

В вашем коде у вас есть поле Datetime на модели. Когда вы ссылаетесь на то, что это объект datetime, который, как говорит ошибка, не сериализуем.

Вы можете обойти это, явно приведя его к строке, например:

for obj in objects_with_category_id_2:
    data =  {'label': str(obj.session_start),
             'value': obj.input_input_value}
    dataSourceBar['data'].append(data)  

Я не знаю, какого типа будет `obj.input_input_value ', но вам также может понадобиться или нет. Попробуйте без первого и посмотрите, работает ли это для вас.

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