Django get TypeError: объект JSON должен быть str, bytes или bytearray, а не dict

Я сохраняю dict в поле JSONfield в моей модели. Все идет нормально, но когда я хочу получить данные по id, появляется следующее сообщение об ошибке:

***TypeError: the JSON object must be str, bytes or bytearray, not dict

Вот пример того, что я делаю:

data = {"123": {"dummy": false, "dummy2": 123}}}

data успешно сохраняется с помощью object.save() в модель. Я вижу это в базе данных.

Когда я пытаюсь получить реестр по id с помощью:

try:
    my_record = models.MyModel.objects.get(business_id=my_id)
except models.MyModel.DoesNotExist:
    logger.debug(f"Record does not exists {my_id}")
    continue

Примечание: business_id - это просто CharField. Я думаю, что это поле уникально, но я не уверен.

business_id = models.CharField(unique=True, max_length=100)

Это полный Traceback:

    my_record = models.MyModel.objects.get(business_id=my_id)
  File "/home/esufan/repos/verdata-service/venv/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/esufan/repos/verdata-service/venv/lib/python3.8/site-packages/django/db/models/query.py", line 425, in get
    num = len(clone)
  File "/home/esufan/repos/verdata-service/venv/lib/python3.8/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
  File "/home/esufan/repos/verdata-service/venv/lib/python3.8/site-packages/django/db/models/query.py", line 1308, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/home/esufan/repos/verdata-service/venv/lib/python3.8/site-packages/django/db/models/query.py", line 70, in __iter__
    for row in compiler.results_iter(results):
  File "/home/esufan/repos/verdata-service/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1100, in apply_converters
    value = converter(value, expression, connection)
  File "/home/esufan/repos/verdata-service/venv/lib/python3.8/site-packages/django/db/models/fields/json.py", line 74, in from_db_value
    return json.loads(value, cls=self.decoder)
  File "/usr/lib/python3.8/json/__init__.py", line 341, in loads
    raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not dict

Я знаю, что проблема связана с JSONField, потому что если я удалю это поле, я смогу правильно получить объект (конечно, это поле Null)

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

У меня есть 2 варианта: сохранить этот dict другим способом, или получить данные другим способом. Есть мысли?

Если вы хотите получить сохраненный словарь в виде словаря, создайте пользовательское json-поле:

class CustomJsonField(models.JSONField):
    def from_db_value(self, value, expression, connection):
        if isinstance(value, dict):
            return value
        return super().from_db_value(value, expression, connection)

и затем используйте это поле в вашей модели.

Вернуться на верх