Relacionamentos Entre Modelos
Introdução
Nós já aprendemos a criar classes de modelos que representam os dados no banco de dados. Uma limitação, entretanto, é que ainda não sabemos como relacioná-los. Por exemplo: temos uma classe Note
representando uma anotação e uma classe User
representando um usuário (esse modelo é definido no app de autenticação), mas não sabemos como salvar no banco de dados a informação de que um determinado usuário criou/é o dono de uma determinada anotação.
Em bancos de dados baseados em tabelas (chamados bancos de dados relacionais) como os que estamos usando, implementam esse tipo de relacionamento usando os id's. Por exemplo:
Nas tabelas acima, a última coluna da tabela de anotações (id_autor
) indica o relacionamento entre uma anotação e um usuário. Nesse caso, a Amanda é autora da 1a, 4a e 5a anotações, enquanto o Breno é o autor da 2a e 3a anotações. Essa ideia de usar o id para apontar para uma linha de outra tabela é conhecido no contexto de bancos de dados como "chave estrangeira", pois é uma chave (id) de outra tabela.
No Django existem campos/colunas especificos para representar esse tipo de relacionamento. Neste handout, vamos nos focar no campo django.db.models.ForeignKey
.
Exercício 1
Exercício 2
Resposta
O argumento on_delete
indica para o Django o que fazer caso o objeto referenciado (no nosso exemplo, o usuário) for removido do banco de dados. Isso é importante, pois caso o Django não faça nada, os dados do banco de dados estarão inconsistentes, pois não existirá o usuário apontado pela chave estrangeira.
Exercício 3
Exercício 4
Agora que temos a informação do autor, vamos aprender a filtrar anotações para mostrar apenas aquelas que pertencem ao usuário logado.