2
respostas

[Dúvida] AttributeError: 'Matricula' object has no attribute 'get_periodo_display'

Ja estou no meu segundo dia procurando a solução deste problema, na aula o professor, pelo menos que eu vi, pois estou assisintindo o curso pela segunda vez para fixar o conteudo, e nao o vi declarando na matricula o atributo get, simplesmente criou

def get_periodo(self, obj):
        return obj.get_periodo_display()

Ja reescrevi, tentei declarar o atributo, la no model matricula, mas nada resolve.

OBS: A api esta funcionando, mas a pagina da ultima url, onde se procura os cursos que tal aluno esta matriculado (Alunos/int:pk/Matricula) ( urls.py ), ela nao funciona por causa desse get

Edit1: NA IMAGEM DO GET_PERIODO ESTA APAGADO, POIS TIREI PRINT QUANDO ESTAVA REESCREVENDO, erro persiste

from rest_framework import serializers
from escola.models import Aluno, Curso, Matricula

class AlunoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Aluno
        fields = '__all__'


class CursoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Curso
        fields = '__all__'

class MatriculaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Matricula
        fields = '__all__'

class ListaMatriculaAlunosSerializer(serializers.ModelSerializer):
    curso = serializers.ReadOnlyField(source='curso.descricao')
    periodo = serializers.SerializerMethodField()
    class Meta:
        model = Matricula
        fields = ['curso', 'periodo']
    def get_periodo(self, obj):
        return obj.get_periodo_display()

    
class ListaAlunosMatriculadosSerializer(serializers.ModelSerializer):
    aluno_nome = serializers.ReadOnlyField(source='aluno.nome')
    class Meta:
        model = Matricula
        fields = ['aluno_nome']

E NA URL DE MATRICULAS EM UM CURSO, NAO APARECE O NOME DE NINGUEM, MAS TEM CADASTRO PELO ADMIN

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Oie

Pra te ajudar de forma melhor por favor manda o repositório do teu projeto ok!?

Porquanto vou tentar te ajudar.

  1. Certifique-se de que o método get_periodo_display esteja definido no modelo Matricula. No seu modelo Matricula, você deve ter um campo chamado periodo com choices. A função get_periodo_display é gerada automaticamente para campos de escolha no Django. Certifique-se de que seu modelo está definido corretamente, algo assim:
class Matricula(models.Model):
    PERIODO_CHOICES = (
        ('primeiro', 'Primeiro Período'),
        ('segundo', 'Segundo Período'),
        # Adicione outras opções de período, se necessário
    )
    
    # Outros campos do modelo
    periodo = models.CharField(max_length=10, choices=PERIODO_CHOICES)
  1. Verifique se o campo periodo no seu modelo Matricula está preenchido corretamente quando você cria uma matrícula. Ele deve ser uma das opções definidas em PERIODO_CHOICES.

  2. Verifique se o nome do método get_periodo_display está correto. Certifique-se de que não haja erros de digitação no código, como letras maiúsculas/minúsculas incorretas.

  3. Certifique-se de que o método get_periodo na classe ListaMatriculaAlunosSerializer esteja sendo chamado. Você pode adicionar um print dentro desse método para verificar se ele está sendo executado:

def get_periodo(self, obj):
    print("Método get_periodo sendo chamado.")
    return obj.get_periodo_display()

Se você não vê a mensagem de "Método get_periodo sendo chamado" no console, isso pode indicar que o método não está sendo chamado.

  1. Verifique se a serialização está sendo usada corretamente em suas visualizações. Certifique-se de que você está usando ListaMatriculaAlunosSerializer em sua visualização, e os dados estão sendo retornados corretamente.

Se, depois de verificar todas essas etapas, o problema ainda persistir, pode haver outros fatores ou configurações específicas no seu projeto que estão causando o problema, então mande o código completo pelo repositório.

Valeu!!