Невозможно сохранить в модель с полем JSONField

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

Модель выглядит следующим образом:

from os import name
from django.db import models

# Create your models here.
class Payload(models.Model):
    name = models.CharField(max_length=255)
    json = models.JSONField()

Команда управления имеет следующее:

        nodes = .... # Various logic to generate a dictionary
        links = .... # Various logic to generate a dictionary
        payload = json.dumps({'nodes': nodes, 'links': links})
        print(payload)

        obj = Payload.objects.filter(name='sankey').first()
        if obj:
            obj.json = payload
            result = obj.save()
            if result:
                print('Successfully updated payload')
            else: print('Could not update payload: '+str(result))
        else:
            obj = Payload(name='sankey', json=payload)
            result = obj.save()
            if result:
                print('Saved new payload')
            else: print('Could not create new payload: '+str(result))

    

        self.stdout.write(self.style.SUCCESS('Generatesankeypayload command executed.'))

Когда я выполняю команду, я получаю:

{"nodes": [{"name": "Jacks Account"}, {"name": "Books"}, {"name": "Coffee & Snacks"}, {"name": "Grooming"}, {"name": "Hobbies"}, {"name": "Personal Gear"}, {"name": "Public Transport"}, {"name": "Jacks Monzo"}, {"name": "Toys"}, {"name": "Janes Account"}, {"name": "Clothing"}, {"name": "Joint Account"}, {"name": "Basic food"}, {"name": "Council tax"}, {"name": "Electricity & Gas"}, {"name": "Mortgage Payments"}], "links": [{"source": 0, "target": 1, "value": "18.98"}, {"source": 0, "target": 2, "value": "7.59"}, {"source": 0, "target": 3, "value": "35.00"}, {"source": 0, "target": 4, "value": "164.98"}, {"source": 0, "target": 5, "value": "300.99"}, {"source": 0, "target": 6, "value": "300.00"}, {"source": 7, "target": 4, "value": "10.99"}, {"source": 7, "target": 8, "value": "22.94"}, {"source": 9, "target": 10, "value": "25.00"}, {"source": 9, "target": 6, "value": "360.00"}, {"source": 11, "target": 12, "value": "641.56"}, {"source": 11, "target": 13, "value": "300.00"}, {"source": 11, "target": 14, "value": "330.00"}, {"source": 11, "target": 15, "value": "3300.00"}]}
Could not update payload: None
Generatesankeypayload command executed.

В какой-то момент при работе с кодом команда действительно сохраняла JSON, но при этом добавляла в базу данных управляющие символы. Вот скриншот из панели администратора Django:

Django admin panel showing escape characters in a JSONField

Не используйте json.dumps(). Если вы используете его, он добавит / и другие вещи. Вы можете добиться использования dictionary JSONField будет обрабатывать сериализацию следующим образом

payload = {'nodes': nodes, 'links': links}
Вернуться на верх