Solucionado (ver solução)
Solucionado
(ver solução)
14
respostas

Duvida de como fazer do melhor jeito possível

Boa noite, estou querendo criar o seguinte banco. Tabela Usuarios Tabela Projeto Tabela Resultados, onde, um Usuario pode ter varios projetos e um projeto pode ter vários resultados.

Então, eu uso o models.ForeignKey(usuario), na tabela projeto e ForeignKey(projeto) na tabela Resultado? ou uso o ManyToOne ?

Não sei qual a maneira mais pratica.

Depois disso feito tenho uma outra duvida, como faço pra pegar todos ou 1 resultados de um projeto de um certo usuario.

Estou entrando agr no mundo ORM, não tenho certeza de como faço, seria algo do tipo:

Resultado.objects.get(projeto = 1)

Qualquer ajuda é bem vinda!

14 respostas

Poderia passar os create table das suas tabelas pra gente dá uma pensada. Ou você ainda não criou eles?

Boa noite André, não criei ainda, mas posso fazer um esboço

class Perfil(models.Model):
    nome = models.CharField(max_length=255, null=False) 

    usuario = models.OneToOneField(User, related_name="perfil",on_delete=models.PROTECT)
    @property
    def email(self):
        return self.usuario.email
Class Projeto(models.Model):
    nome = models.CharField(max_length=255, null=False) 
    status = nome = models.CharField(max_length=255, null=False) 
  perfil =  models.ForeingKey(Perfil, on.delete=CASCADE)


Class Resultado(models.Model):
    arquivo= models.CharField(max_length=255, null=False) 
    status = nome = models.CharField(max_length=255, null=False) 
  projeto= models.ForeingKey(Projeto, on.delete=CASCADE) 

acho que seria algo assim

Só pode existir um usuário distinto e um usuário pode ter vários projetos. Então é OneToMany.

Um usuário pode ter vários resultados pois pode ter vários projetos. Então é OneToMany.

Só pode existir um projeto distinto e um projeto pode ter somente um resultado. Então é OneToOne.

Um projeto de pode 1 a N resultados, como ficaria o model de cada um ?

E também como faria o "select"?

Eu particularmente fico na duvida de como salvar os valores nas tabelas corretamente, e de fazer um "join" sem ser realmente escrevendo um join

O model ficaria assim (perdi mow tempo fazendo no bloco de notas e na hora de colar desformatou tudo kkkkk)

https://imgur.com/a/uPuUbEW

SELECT * FROM USUARIO    
INNER JOIN PROJETO    ON USUARIO.id = PROJETO.id_user
INNER JOIN RESULTADO ON PROJETO.id = RESULTADO.id_proj

Eu já tinha uma visão de como o model ficaria, e essa query também, agora como essa query

SELECT * FROM USUARIO    
INNER JOIN PROJETO    ON USUARIO.id = PROJETO.id_user
INNER JOIN RESULTADO ON PROJETO.id = RESULTADO.id_proj

seria feita com as funções do django?crtz que tem um jeito das funções deles

Se você referenciar tudo certinho no Django vai ficar tão amarrado que ao selecionar o objeto projeto ele já vai vir com todos os campos desse select. Você vai poder chamar: projeto.id projeto.result projeto.user e por aí vai. Quando você trabalha orientado a objetos fica tudo mais fácil pois você já amarra todo mundo usando a chave estrangeira.

solução!

Pronto, é nesse ponto que quero chegar, no meu models que coloquei mais cedo, eu coloco manyToOne, em Projeto e Resultado, no lugar de ForeingKey certo ?

ai se eu quiser pegar todos os resultados de um projeto seria algo assim ?

user = user.objects.get(nome = thiago)
projeto = projeto.objects.get(user = user, nome="projeto_x")
resultado = resultado.objects.get(projeto = projeto)

dessa forma, fico achando que vou pegar todos os resultados de um projeto de um certo usuário, seria assim a melhor maneira ?

Eu acho muito bom. Assim fica bem amarrado.

Você acha que está certo ? Só faço trocar os foreingKey, pra ManyToOne, e tento o Join desse jeito que fiz?

Sim, eu acho que vai funcionar. Testa e vê se roda.

Ok, vou deixar o post aberto, assim que possivel vou testar e retorno aqui, bom que da tempo de mais alguém opinar também.

Vlw pela ajuda, até logo!.

Deu tudo certo, clw!