Obter id de um objeto ForeignKey

43 views
Skip to first unread message

Yasmin Manuela

unread,
Jun 30, 2023, 8:20:36 AM6/30/23
to Django Brasil
Olá, estou tendo problema ao tentar acessar o id de um campo que possui chave estrangeira com o outro na minha view. Se alguém souber como se faz, agradeço.

Na minha view: 
( Aqui preciso do curso pois ele tem relação com o módulo, fiz algumas consultas e não consegui).


@login_required
@permission_required('accounts.acessar_area_do_professor', raise_exception=True)
def adicionar_modulos(request):
if request.method == 'POST':

dados = {
'titulo': request.POST['titulo_modulo'],
'descricao': request.POST['descricao_modulo'],
}

if 'dados_modulos' in request.session:
request.session['dados_modulos'].update(dados)
else:
request.session['dados_modulos'] = dados

try:
if 'modulo_id' in request.session:
modulo_id = request.session['modulo_id']
modulo = Modulo.objects.get(id=modulo_id)
modulo.__dict__.update(dados)
else:
modulo = Modulo(**dados)
del request.session['dados_modulos']

modulo.clean()
modulo.save()

request.session['modulo_id'] = modulo.id
return redirect('adicionar_video_aula')

except ValidationError as e:
messages.error(request, e.message)
return render(request, 'adicionar_modulos.html')


Os modelos são esses:


class Curso(models.Model):
titulo = models.CharField(max_length=20, default=None, verbose_name='Título do curso')
descricao = models.TextField(verbose_name='Descrição')
professor = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='cursos')
imagem_capa = models.ImageField(upload_to='cursos/imagem_capa')
duracao_curso = models.CharField(max_length=30, verbose_name='Duração do curso', default=0)
status_choices = (
('P', 'Pendente'),
('A', 'Aprovado'),
('R', 'Rejeitado'),
)
status = models.CharField(max_length=1,choices=status_choices, default='P')

categoria_choices = (
('DS', 'Ciência De Dados'),
('AD', 'Analise De Dados'),
('IA', 'Inteligência Artificial'),
('DB', 'Desenvolvimento Web Backend'),
('DF', 'Desenvolvimento Web Frontend'),
('O', 'Outro'),
)
categoria = models.CharField(max_length=2, choices=categoria_choices, verbose_name='Categoria')

class Meta:
verbose_name = "Curso"
verbose_name_plural = "Cursos"
def __str__(self):
return self.titulo
def clean(self):
if not all([self.titulo, self.descricao, self.imagem_capa, self.categoria]):
raise ValidationError('Preencha todos os campos para prosseguir.')
def save(self, *args, **kwargs):
self.clean()
super().save(*args, **kwargs)

class Modulo(models.Model):
curso = models.ForeignKey(Curso, on_delete=models.CASCADE, default=None, related_name='modulos')
titulo = models.CharField(max_length=50, verbose_name='Título do módulo')
descricao = models.TextField(verbose_name='Descrição do módulo', null=True)
qtd_aulas = models.CharField(max_length=20, verbose_name='Quantidade de aulas')

class Meta:
verbose_name = 'Módulo'
verbose_name_plural = 'Módulos'

def __str__(self):
return self.titulo
def clean(self):
if not all([self.titulo, self.descricao]):
raise ValidationError('Preencha todos os campos para prosseguir.')
def save(self, *args, **kwargs):
self.clean()
super().save(*args, **kwargs)

Lucas Brahm

unread,
Jun 30, 2023, 8:41:32 AM6/30/23
to django...@googlegroups.com
Olá, qual o erro que está acontecendo?

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/django-brasil/e292909d-326c-47d6-8836-5290a7fb11cfn%40googlegroups.com.

Dionatan Maicon

unread,
Jun 30, 2023, 8:42:17 AM6/30/23
to django...@googlegroups.com
Utilize o prefixo '_id' no final da foreignkey, exemplo se vai utilizar o id do 'professor' , utilize 'professor_id' ou no caso so id do curso use curso_id na consulta que você está tentando.

Em sex., 30 de jun. de 2023 às 09:20, Yasmin Manuela <manuela...@gmail.com> escreveu:
--

Dionatan Maicon

unread,
Jun 30, 2023, 8:45:32 AM6/30/23
to django...@googlegroups.com
Agora vi que no bloco do try, dentro do bloco do if, você declara a variavel 'modulo' que armazena a consulta, porém depois você chama essa variavel para pega o id. Como ela foi declarada no bloco do if, não está acessivel quando você chama ela fora do bloco.

Yasmin Manuela

unread,
Jun 30, 2023, 9:27:05 AM6/30/23
to Django Brasil
É verdade, agora corrigi e deu certo, obrigada pela observação !
Reply all
Reply to author
Forward
0 new messages