Ir ao conteúdo
  • Cadastre-se

Python Existe uma maneira de fazer a FK de uma model retornar o exato ID e não o nome


Posts recomendados

    class Funcionario(models.Model):
        nome = models.CharField(max_length=45, null=True)
        CPF = models.CharField(max_length=14, default=0)
    
    
        def __str__(self):
            return self.nome
    
    
    class Bloco(models.Model):
        tipo = models.IntegerField(default=0)
        responsavel = models.CharField(max_length=255, null=True)
    
    
    class Participacao(models.Model):
        Funcionario_id = models.ForeignKey(Funcionario, related_name='Funcionarios', on_delete=models.PROTECT, null=True)
        Bloco_id = models.ForeignKey(Bloco, related_name='blocos', on_delete=models.PROTECT, null=True)
        quantDias = models.IntegerField(default=0)
        
        def __str__(self):
            return str(self.Funcionario_id)

Quando eu chamo a FK da tabela "Participacao", ele me retorna o nome referente ao funcionário daquele ID, e não o ID em si.

Exemplo:

partics = Participacao.objects.all()

for partic in partics:

     print (partic.Funcionario_id)



//output

Maria

João

José

Mario

E o que eu busco é o ID para que posso comparar com a chave primária da tabela funcionario em um if.

O que quero é:

partics = Participacao.objects.all()

for partic in partics:

     print (partic.Funcionario_id)



//output

1

2

3

4

Eu sei que o motivo de retornar o nome é devido ao trecho declarado na model Funcionario...

def __str__(self): 

return self.nome

Já tentei colocar "self.pk" porém retorna erro.

Já retirei o trecho, porém quando retiro ele, ou mudo 'str' pra 'int', ele me retorna o ID da seguinte forma.


 

Funcionario object (1)

Funcionario object (2)

Funcionario object (3)

Funcionario object (4)

Existe alguma forma de fazer a FK me retornar apenas o ID da FK?

Eu já tentei usar o "values_list", de fato consigo pegar o ID, porém não consigo achar uma forma de acessar aquela linha da tabela, pois preciso pegar o ID e outros 2 campos referentes aquela linha.

E usando o "values_list" com mais de 1 dado, não é possível comparar os valores em um if depois.

Link para o comentário
Compartilhar em outros sites

Então o que voce precisa fazer é acessar os índices do seu queryset, quando voce importa todos os objetos de uma tabela, voce tem o queryset, onde voce pode manipular os objetos dentro dela veja como fiz no shell

image.png.11683594661a71556df761e8e49f2472.png

 

após importar do model a tabela Participação, eu coloquei todos os objetos dela dentro do queryset.

se voce der um dir(queryset) verá todos os objetos acessíveis dele inclusive o values_list, entendeu que o queryset não é nada mais que uma lista onde estão os dados da tabela Participacao ? faça um laço que percorra o queryset pelo indice da lista e retorno o id para voce, conforme está na imagem acima.

 

veja que acessei os valores de cada indice [0],[1],... e depois pedi o ID queryset[0].id...

 

Era isso?🤔

Link para o comentário
Compartilhar em outros sites

@fspjonny O que preciso fazer é comparar a Primary Key de uma model(Funcionario com a sua Foreign Key em outra model(Participacao).

O problema é que quando comparo com o "if" ele sempre me retorna "falso", ou seja, sempre cai no "else".

Por exemplo:

funcionarios = Funcionario.objects.all()

participacoes = Participacao.objects.all()



for funcionario in funcionarios:

    for participacao in participacoes:

        if (funcionario.pk == participacao.Colaborador_pk):

            print (funcionario.pk, participacao.Colaborador_pk, "true")

        else:

            print (funcionario.pk, participacao.Colaborador_pk, "false")

 

O código acima é o que estou usando para testar o if no shell.

 

O output é algo mais ou menos assim.

1 1 false

1 2 false

1 3 false

1 4 false

2 1 false 

2 2 false

2 3 false

2 4 false

3 1 false

3 2 false

3 3 false

3 4 false

4 1 false 

4 2 false

4 3 false

4 4 false

Você vê que deveria ter saído 4 "true", mas todos sairam como "false".

No caso o 1 1, 2 2, 3 3, 4 4, deveriam ter sido true, mas saiu false por alguma razão.

Porém quando eu uso o mesmo código só que com o..

participacao = Participacao.objects.values_list('Funcionario_id', flat=True)

Ele me retorna o output esperado.

O problema é que dessa forma eu fico limitado a apenas a uma informação da tabela "participacao", porém preciso ter acesso aos outros campos.

 

Entendeu? 

Link para o comentário
Compartilhar em outros sites

24 minutos atrás, Anonn disse:

@fspjonny O que preciso fazer é comparar a Primary Key de uma model(Funcionario com a sua Foreign Key em outra model(Participacao).

O problema é que quando comparo com o "if" ele sempre me retorna "falso", ou seja, sempre cai no "else".

Por exemplo:


funcionarios = Funcionario.objects.all()

participacoes = Participacao.objects.all()



for funcionario in funcionarios:

    for participacao in participacoes:

        if (funcionario.pk == participacao.Colaborador_pk):

            print (funcionario.pk, participacao.Colaborador_pk, "true")

        else:

            print (funcionario.pk, participacao.Colaborador_pk, "false")

 

O código acima é o que estou usando para testar o if no shell.

 

O output é algo mais ou menos assim.


1 1 false

1 2 false

1 3 false

1 4 false

2 1 false 

2 2 false

2 3 false

2 4 false

3 1 false

3 2 false

3 3 false

3 4 false

4 1 false 

4 2 false

4 3 false

4 4 false

Você vê que deveria ter saído 4 "true", mas todos sairam como "false".

No caso o 1 1, 2 2, 3 3, 4 4, deveriam ter sido true, mas saiu false por alguma razão.

Porém quando eu uso o mesmo código só que com o..


participacao = Participacao.objects.values_list('Funcionario_id', flat=True)

Ele me retorna o output esperado.

O problema é que dessa forma eu fico limitado a apenas a uma informação da tabela "participacao", porém preciso ter acesso aos outros campos.

 

Entendeu? 

 

voce já experimentou comparar as duas chaves, mas antes converter elas em int ou str?, eu estou começando a achar que o motivo do seu False, é a diferença entre tipos, pois não sei como isso está vindo de suas tabelas ou consultas.

 

Algo como: 

if (int(funcionario.pk) == int(participacao.Colaborador_pk)):

ou

if (str(funcionario.pk) == str(participacao.Colaborador_pk)):

 

porque quando você tem tipos iguais e faz uma pergunta de igualdade(==), só vai te retornar TRUE ou FALSE, se os valores comparados forem diferentes, pois os tipos agora são iguais.

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...