Me corrija se eu estiver errado. Nesse caso tu já tem o ID do produto? Pois se tu já tem o id do produto e só precisa pegar a imagens na outra tabela, você pode consultar diretamente a outra tabela passando o ID do produto. Vou exemplificar aqui com duas tabela do vídeo. Nos temos a tabela Produto e a Venda, onde venda possui Produto. Agora, vamos supor que já tem o id do produto e precisamos buscar todas as vendas desse produto, neste caso, não preciso fazer uma consulta em Produto para depois fazer em Venda, faço diretamente na consulta desta forma: Venda.objects.filter(produto=1) e caso tu precisar apenas de um campo da tabela tu pode fazer assim também Venda.objects.values("data_venda").filter(produto=1) nesse caso já tenho o id do produto e quero apenas as data de venda deste produto. Vocẽ não precisa do objeto produto, você só precisa ter a FK do mesmo. Agora se ao invés do ID (FK) tu tiver o campo Nome que não é FK por exemplo, ai não tem vai te jeito, tu vai ter que passar pelas duas tabelas, mas ai aconselho a fazer por join ao invés de duas consultas, ficaria assim: Venda.objects.filter(produto__nome="Notebook HP"). Espero ter conseguido lhe ajudar! Forte abraço! =D
@@RafaelGalleani Entendi os dois exemplos, assim tenho duas tabelas, Tb_Produto e Tb_Produto_Imagem, a Tb_Produto_Imagem tem uma FK para Tb_Produto, dai na consulta vou no seguinte sentido, pesquiso por produto depois pego as imagens dele, eu criei algumas query passando de um para o outro ex: lista_produtos = Tb_Produto.obj..filter... depois Tb_Produto_Imagem.obj...filter(produto_in=lista_produtos) Assim com isso resolvi as múltiplas consultas, mas acho estranho o fluxo pois no final estou com objeto de Tb_Produto_Imagem, e as imagens é opcional e não consegui fazer uma consulta que me retorne um produto que não tem imagem, da forma como ficou a consulta é obrigado ter imagem.
@@FAELP22 Ah agora eu entendi Isael, o que tu precisa é de um left join da produto com a imagem. De fato isso tu não vai conseguir fazer sem ser da forma como tu já resolveu, até dei uma pesquisada pra ter certeza que não é apenas um desconhecimento meu, mas aparentemente não é. Realmente não tem como usar left join no Django, pelo que pesquisei e li na documentação pelo menos não encontrei nada a respeito, encontrei até um ticket que sugeria forma de aplicar o left join. Aparentemente, pelo que encontrei só seria possível através do uso de Raw SQL Queries (docs.djangoproject.com/en/3.0/topics/db/sql/) mas não fica tão elegante e se não for algo que esteja impactando muito de performance, não vejo porque utiliza-lo, ai faz mais sentido manter como está no seu código. Espero que tenha conseguido lhe ajudar, infelizmente ao que tudo indica isso não foi pensado no Django. :S
Muito útil e bem explicado professor. Me tire uma dúvida por favor, em outro vídeo seu, você ensina a usar a função get_absolute_url no model e chamando ela no html de listagem para fazer o update, porém quando apliquei as dicas dessa aula de perfomance parece que essa função não responde mais. Sabe dizer como posso continuar chamando essa função sem perder essa instrução de performance?
Neste situação, não tem como, porque você não tem mais o objeto da classe e sim um dicionário. Uma forma de manter isso em funcão e ter performance ao mesmo tempo é utilizando template tags (docs.djangoproject.com/en/4.0/howto/custom-template-tags/).
Ajudou bastante!! Só não consegui entender o 'produto__tipo' , em qual parte é declarado isso (origem) ? Observei que ele não foi atribuido nos models e fiquei na duvida
Opa Thiago! Existe uma relação entre a tabela produto e a tabela tipo_produto, é daí que temos o produto__tipo. Se você olha em 3m00s, verá o ER das tabelas e nos 3m54s, você verá as duas classes, Produto e TipoProduto, onde na classe Produto temos um campo tipo sendo relacionado com a tabela TipoProduto. Espero ter ajudado! Abraços!
Teria problema de segurança, se você estiver fazendo uma requisição ajax por exemplo, onde você pode estar trefegando informação sensível a qual aquele usuário não deveria poder acessar e você está gerenciando isso no seu frontend e não no backend, isso seria uma brecha de segurança.
Vale Rafael. Esse tipo de conteúdo que está faltando em tutoriais e vídeos por aí.... Parabéns!
Conteúdo massa demais! Muito obrigado por compartilhar!
Excelente vídeo!
Ajudou bastante
Feliz em saber Igor! Vlw!
você tem uma dica para fazer um select_related reverso? tipo assim tenho tb_produto
Me corrija se eu estiver errado. Nesse caso tu já tem o ID do produto? Pois se tu já tem o id do produto e só precisa pegar a imagens na outra tabela, você pode consultar diretamente a outra tabela passando o ID do produto. Vou exemplificar aqui com duas tabela do vídeo. Nos temos a tabela Produto e a Venda, onde venda possui Produto. Agora, vamos supor que já tem o id do produto e precisamos buscar todas as vendas desse produto, neste caso, não preciso fazer uma consulta em Produto para depois fazer em Venda, faço diretamente na consulta desta forma: Venda.objects.filter(produto=1) e caso tu precisar apenas de um campo da tabela tu pode fazer assim também Venda.objects.values("data_venda").filter(produto=1) nesse caso já tenho o id do produto e quero apenas as data de venda deste produto. Vocẽ não precisa do objeto produto, você só precisa ter a FK do mesmo. Agora se ao invés do ID (FK) tu tiver o campo Nome que não é FK por exemplo, ai não tem vai te jeito, tu vai ter que passar pelas duas tabelas, mas ai aconselho a fazer por join ao invés de duas consultas, ficaria assim: Venda.objects.filter(produto__nome="Notebook HP").
Espero ter conseguido lhe ajudar! Forte abraço! =D
@@RafaelGalleani Entendi os dois exemplos, assim tenho duas tabelas, Tb_Produto e Tb_Produto_Imagem, a Tb_Produto_Imagem tem uma FK para Tb_Produto, dai na consulta vou no seguinte sentido, pesquiso por produto depois pego as imagens dele, eu criei algumas query passando de um para o outro ex:
lista_produtos = Tb_Produto.obj..filter... depois Tb_Produto_Imagem.obj...filter(produto_in=lista_produtos)
Assim com isso resolvi as múltiplas consultas, mas acho estranho o fluxo pois no final estou com objeto de Tb_Produto_Imagem, e as imagens é opcional e não consegui fazer uma consulta que me retorne um produto que não tem imagem, da forma como ficou a consulta é obrigado ter imagem.
@@FAELP22 Ah agora eu entendi Isael, o que tu precisa é de um left join da produto com a imagem. De fato isso tu não vai conseguir fazer sem ser da forma como tu já resolveu, até dei uma pesquisada pra ter certeza que não é apenas um desconhecimento meu, mas aparentemente não é. Realmente não tem como usar left join no Django, pelo que pesquisei e li na documentação pelo menos não encontrei nada a respeito, encontrei até um ticket que sugeria forma de aplicar o left join. Aparentemente, pelo que encontrei só seria possível através do uso de Raw SQL Queries (docs.djangoproject.com/en/3.0/topics/db/sql/) mas não fica tão elegante e se não for algo que esteja impactando muito de performance, não vejo porque utiliza-lo, ai faz mais sentido manter como está no seu código.
Espero que tenha conseguido lhe ajudar, infelizmente ao que tudo indica isso não foi pensado no Django. :S
@@RafaelGalleani obrigado.
Muito útil e bem explicado professor. Me tire uma dúvida por favor, em outro vídeo seu, você ensina a usar a função get_absolute_url no model e chamando ela no html de listagem para fazer o update, porém quando apliquei as dicas dessa aula de perfomance parece que essa função não responde mais. Sabe dizer como posso continuar chamando essa função sem perder essa instrução de performance?
Neste situação, não tem como, porque você não tem mais o objeto da classe e sim um dicionário. Uma forma de manter isso em funcão e ter performance ao mesmo tempo é utilizando template tags (docs.djangoproject.com/en/4.0/howto/custom-template-tags/).
Ajudou bastante!! Só não consegui entender o 'produto__tipo' , em qual parte é declarado isso (origem) ? Observei que ele não foi atribuido nos models e fiquei na duvida
Opa Thiago! Existe uma relação entre a tabela produto e a tabela tipo_produto, é daí que temos o produto__tipo. Se você olha em 3m00s, verá o ER das tabelas e nos 3m54s, você verá as duas classes, Produto e TipoProduto, onde na classe Produto temos um campo tipo sendo relacionado com a tabela TipoProduto. Espero ter ajudado! Abraços!
Isso pode influenciar na segurança tbm? Por exemplo quando vc retorna um user ?
Teria problema de segurança, se você estiver fazendo uma requisição ajax por exemplo, onde você pode estar trefegando informação sensível a qual aquele usuário não deveria poder acessar e você está gerenciando isso no seu frontend e não no backend, isso seria uma brecha de segurança.