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)
и затем используйте это поле в вашей модели.