1
resposta

ERRO SERIALIZER

Boa tarde, amigos.

Possuo o seguinte serializer:

class PhoneSerializer(serializers.ModelSerializer):
    class Meta:
        model = Phone
        fields = ['id', 'client', 'ddd', 'number']

Recebo um POST com o seguinte JSON:

 {
            "name": "Alan",
            "phones": [
                {
                    "number": "9123456789",
                    "ddd": "33"
                }
            ]
        }

Quando passo o Client pelo seu serializer, tudo ocorre bem, então pego seu id para poder enviar junto com os itens da lista "phones" para o serializer acima citado, desta forma:

@api_view(['POST'])
def register(request):
    if request.POST:
        serializer = ClientSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            for phone in request.data["phones"]:     
                phone['client'] = serializer.data['id']               
                phone = PhoneSerializer(data=phone)
                if phone.is_valid():
                    phone.save()
                else:
                    return Response(phone.errors, status=400)

Porém estou recebendo o seguinte erro quando eu rodo o teste:

  File "/code/backend/views.py", line 16, in register
    phone['client'] = serializer.data['id']
TypeError: 'str' object does not support item assignment

Alguém poderia me orientar? Desde já agradeço.

1 resposta

Olá Alan, tudo bem com você?

Peço desculpas pela demora em lhe responder.

O erro que está acontecendo é porque você está tentando fazer uma atribuição em uma string, o que não é possível. Na linha phone['client'] = serializer.data['id'], você está tentando atribuir o valor do ID do cliente a uma chave do dicionário phone, mas phone é um objeto do tipo PhoneSerializer, e não um dicionário. O correto seria acessar o valor da chave client no dicionário de dados do objeto phone, que pode ser obtido chamando o método .data do serializer.

Para corrigir o problema, você pode alterar a linha phone['client'] = serializer.data['id'] para o seguinte:

phone_data = {'client': serializer.data['id'], 'number': phone['number'], 'ddd': phone['ddd']}
phone = PhoneSerializer(data=phone_data)

Isso criará um dicionário com as informações necessárias para criar um novo objeto Phone, incluindo o ID do cliente retornado pelo serializer ClientSerializer. Em seguida, você pode criar um novo objeto PhoneSerializer com esses dados e salvá-lo no banco de dados.

Veja como ficaria o código:

@api_view(['POST'])
def register(request):
    if request.POST:
        serializer = ClientSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            for phone in request.data["phones"]:
                phone['client'] = serializer.data['id']
                phone_serializer = PhoneSerializer(data=phone)
                if phone_serializer.is_valid():
                    phone_serializer.save()
                else:
                    return Response(phone_serializer.errors, status=400)
            return Response(serializer.data, status=201)
        else:
            return Response(serializer.errors, status=400)

Todavia, vale ressaltar que como é um assunto externo ao curso e que não tenho acesso ao cenário completo do projeto incluindo a estrutura inicial do seu banco de dados, outros testes terão de ser feitos afim 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!