1
resposta

Erro com loaddata de um arquivo json

Estou tentando inserir um arquivo json no banco de dados, mas aparece um erro. Não sei se tem algum erro no json ou no model.

Arquivo json:

[
  {
    "model": "cursos.Curso",
    "pk": 1,
    "fields": {
      "nome": "Sífilis: Vigilância Epidemiológica",
      "descricao": "O módulo Sífilis: Vigilância Epidemiológica tem como objetivo promover uma atualização dos profissionais de saúde acerca dos conceitos essenciais nessa área de conhecimento, com foco na sífilis.",
      "objetivo": "Proporcionar conhecimentos para médicos, enfermeiros e demais profissionais de saúde acerca da Vigilância Epidemiológica e sua integração com a Atenção em saúde, com foco na sífilis adquirida, congênita e em gestantes.",
      "idade_minima": 12,
      "componentes": [
        {
          "nome": "Integração ao AVASUS e PEPSUS",
          "carga_horaria": 30,
          "ordem": 1
        },
        {
          "nome": "Atenção à Saúde do Idoso na Atenção Primária à Saúde.",
          "carga_horaria": 50,
          "ordem": 2
        }
      ]
    }
  }
]

models.py:

class Componente(models.Model):
    nome = models.CharField(verbose_name='Nome do componente', max_length=150)
    carga_horaria = models.IntegerField(verbose_name='Carga horária')
    ordem = models.IntegerField()


class Curso(models.Model):
    nome = models.CharField(verbose_name='Nome do curso', max_length=150)
    descricao = models.TextField(verbose_name='Descrição')
    objetivo = models.TextField(verbose_name='Objetivo')
    idade_minima = models.IntegerField(verbose_name='Idade mínima')
    componentes = models.ManyToManyField(Componente, related_name='curso', verbose_name='Componentes')

Erro:

Traceback (most recent call last):
  File "C:\Users\JCAS1\PycharmProjects\djangoProject\test_command\manage.py", line 22, in <module>
    main()
  File "C:\Users\JCAS1\PycharmProjects\djangoProject\test_command\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\base.py", line 414, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\base.py", line 460, in execute
    output = self.handle(*args, **options)
  File "C:\Users\JCAS1\PycharmProjects\djangoProject\test_command\core\management\commands\add_cursos.py", line 9, in handle
    call_command('loaddata', 'cursos.json')
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\__init__.py", line 198, in call_command
    return command.execute(*args, **defaults)
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\base.py", line 460, in execute
    output = self.handle(*args, **options)
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\commands\loaddata.py", line 102, in handle
    self.loaddata(fixture_labels)
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\commands\loaddata.py", line 163, in loaddata
    self.load_label(fixture_label)
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\management\commands\loaddata.py", line 251, in load_label
    for obj in objects:
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\serializers\json.py", line 70, in Deserializer
    yield from PythonDeserializer(objects, **options)
  File "C:\Users\JCAS1\.virtualenvs\test_command\lib\site-packages\django\core\serializers\python.py", line 142, in Deserializer
    raise base.DeserializationError.WithData(
django.core.serializers.base.DeserializationError: Problem installing fixture 'C:\Users\JCAS1\PycharmProjects\djangoProject\test_command\fixtures\cursos.json': ["“{'nome': 'Integração ao 
AVASUS e PEPSUS', 'carga_horaria': 30, 'ordem': 1}” value must be an integer."]: (cursos.Curso:pk=1) field_value was '{'nome': 'Integração ao AVASUS e PEPSUS', 'carga_horaria': 30, 'ordem
': 1}'
1 resposta

Olá Júlio, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

Quando trabalhamos com uma relação muito para muitos (ManyToManyField), devemos representar o relacionamento muitos-para-muitos usando as chaves primárias dos objetos relacionados. No seu caso, no campo componentes do JSON, em vez de adicionar diretamente os objetos do tipo Componente, você pode adicionar apenas os IDs desses objetos.Por exemplo, imagine que existem dois objetos do tipo Componente no banco de dados, com IDs 1 e 2. Para relacioná-los com um objeto do tipo Curso basta adicionar os IDs 1 e 2 no campo componentes do JSON desse objeto Curso.

Sendo assim, recomendo que você crie arquivos separados, um para o cadastro dos componentes e outro, para cadastro dos cursos e consequente o relacionamento com os componentes. Abaixo, alguns exemplos destes dois arquivos:

Arquivo componentes.json

[
    {
      "model": "cursos.Componente",
      "pk": 1,
      "fields": {
        "nome": "Integração ao AVASUS e PEPSUS",
        "carga_horaria": 30,
        "ordem": 1
      }
    },
    {
      "model": "cursos.Componente",
      "pk": 2,
      "fields": {
        "nome": "Atenção à Saúde do Idoso na Atenção Primária à Saúde.",
        "carga_horaria": 50,
        "ordem": 2
      }
    }
  ]


Arquivo: curso.json


[
    {
      "model": "cursos.Curso",
      "pk": 1,
      "fields": {
        "nome": "Sífilis: Vigilância Epidemiológica",
        "descricao": "O módulo Sífilis: Vigilância Epidemiológica tem como objetivo promover uma atualização dos profissionais de saúde acerca dos conceitos essenciais nessa área de conhecimento, com foco na sífilis.",
        "objetivo": "Proporcionar conhecimentos para médicos, enfermeiros e demais profissionais de saúde acerca da Vigilância Epidemiológica e sua integração com a Atenção em saúde, com foco na sífilis adquirida, congênita e em gestantes.",
        "idade_minima": 12,
        "componentes": [1,2]
      }
    }
]

Essa abordagem é conveniente, pois você não precisa se preocupar com a ordem em que os objetos são importados ou com possíveis conflitos de chave primária. Basta garantir que os objetos relacionados já existam no banco de dados com os IDs corretos antes de realizar a importação. Todavia, vale ressaltar que como é um assunto externo ao curso e que não tenho acesso ao cenário completo do projeto, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema.

Espero ter ajudado. Continue mergulhando em conhecimento!

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!