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

Dúvida sobre MVC

Em uma aula do curso, é apresentado o seguinte código para carregar e apresentar todos os convites recebidos, dentro do HTML:

{% for convite in perfil_logado.convites_recebidos.all %}
    <li class="list-group-item">
        {{ convite.solicitante.nome }} 
        <a href="#" class="pull-right">aceitar</a>
    </li>
{% endfor %}

Durante o vídeo é dito que primeira linha do código (perfil_logado.convites_recebidos.all) é uma query, que recupera todos os convites do banco.

Aí que surgiu a dúvida. Se é uma query, não deveria estar no arquivo views.py, para respeitar o padrão MVC?

4 respostas
solução!

Hum, excelente pergunta Winstein!

Primeiro, vou falar sob o ponto de vista do Django e seu ORM inspirado no Active Record do Rails.

Se você olhar esse código do jeito que está, se eu não te falasse nada que o Django por detrás dos panos vai ao banco, você estaria acessando o método de um modelo e isso está perfeitamente aceito dentro do modelo MVC. Acessar dados do modelo e chamar métodos de um modelo rico faz parte do OO.

Agora, se você cai em detalhe de implementação, com certeza você sabe que o Django está realizando uma consulta ao banco de dados, mesmo que engane o programador que não sabe que o .all não é um método ordinário, mas sim um criado pelo sistema de persistência do Django.

Sendo assim, a decisão se acessamos ou não este método na view tem mais a ver com o viés de quem está criando a aplicação. Django visa a praticidade e convenção sobre normas e práticas, até porque, em teoria, o sistema de persistência do Django, assim como Active Record seria uma aberração, porque mistura infra estrutura com o modelo. Nem por isso deixam de utilizá-lo. Há até quem o defenda se comparado com outros padrões de projeto para persistência como Data Mapper. Pescou a ideia aqui?

Então, pela próprio frameworek em si e visando a simplicidade digamos que esse é o jeito Django de ser resolver problemas como esse facilmente, tem que que criar mais código no seu controller. Mas nada o impede de separar.. e aplicar o que você entende como correto, e que realmente é.

É até legal, porque quem se preocupa realmente com separação em camadas e é inflexível nunca utilizaria Django, justamente pelo seu sistema de persistência misturar modelo com código de infraestrutura. Ou seja, o problema que você levantou vem até antes, na parte de persistência.

Espero ter ajudado a esclarecer a sua dúvida, ou até mesmo colocar uma pulga atrás da sua orelha.

Esclareceu uma dúvida mas criou outra hahaha

Como eu posso saber se "desrespeitar" o MVC em determinado ocasião é bom ou ruim? Devo sempre prezar pela maior legibilidade e manutenibilidade do código?

Hum.. eu vou te dar uma dica: tanto o Ruby on Rails quanto o Django ferem alguns padrões em benefício da simplicidade. Talvez, você pesquisando sobre vantagens e desvantagens do Ruby on Rails (ou quem sabe, polêmicas) você consiga engrandecer essa discussão. Como o Django é inspirado fortemente no Ruby on Rails, sofre das mesmas vicissitudes.

Ok Flávio, obrigado pelas respostas! Elas abriram mais minha cabeça.