Eu apenas comecei a aprender Django / Python / Desenvolvimento Web. Esse problema está me incomodando há um tempo.
Estou criando um aplicativo com vários modelos no Django. Eu tenho um views.py que basicamente é apenas renderizar as respostas aos respectivos modelos e eu tenho um models.py onde estruturei meu banco de dados. Em um dos meus modelos, preciso fazer upload de uma imagem (o que posso fazer) e executar uma lógica baseada nos recursos da imagem carregada (ainda não concluída). Essa lógica envolve muitos cálculos pesados. Após realizar os cálculos, a lógica deve retornar algumas informações processadas (coordenadas) ao modelo.
Consegui executar todas essas ações com êxito em um aplicativo de desktop python autônomo que chamava os arquivos python um após o outro. No entanto, como agora eu quero fazer disso uma aplicação Web, comecei a usar a estrutura do Django.
Pesquisei bastante, mas ainda não sou capaz de descobrir onde exatamente devo colocar esse arquivo Python contendo toda a lógica. Devo ter outro arquivo baseado em classe (logic.py)
e chamá-lo de view.py
? Pesquisei no Google e descobri que muitos desenvolvedores estão colocando sua lógica de negócios em seus models.py no Django. No entanto, acho que intuitivamente não está certo, pois o modelo deve se comunicar exclusivamente com o back-end. Qualquer ajuda seria apreciada. Agradecemos antecipadamente.
Respostas:
Existem várias opções, dependendo de quais são seus requisitos:
Adicione a lógica, por exemplo, ao
Image
modelo. Essa é uma opção útil se você precisar armazenar metadados por imagem no banco de dados, e cada instância do modelo (cada imagem) será processada por si mesma.Adicione a lógica como uma
Image
classe Python simples , por exemplo, em um arquivo chamadoimage.py
. Nada no Django o impede de adicionar uma lógica diferente daquela nos módulosviews
oumodels
. Esta é uma boa opção se a lógica da imagem for um componente central do seu aplicativo Django (por exemplo, um aplicativo de processamento de imagens).Crie um projeto Python separado que forneça a lógica e, em seguida, chame-o de seus pontos de vista. Certifique-se de instalar este projeto no ambiente Python do seu aplicativo Django. Essa opção é válida se o objetivo do seu aplicativo Django for carregar e visualizar imagens ou mostrar os resultados do processamento de imagens em resposta direta à solicitação do usuário, mas onde o processamento de imagens também pode ser usado por outros projetos.
Crie um aplicativo separado que processe solicitações de forma assíncrona e seja executado separadamente do seu aplicativo Django. Essa opção é útil se você precisar dissociar o processamento de imagens do ciclo de solicitação do aplicativo, processar um grande número de imagens ou se cada cálculo demorar muito para ser resolvido dentro do tempo de um ciclo de solicitação (digamos, no máximo, 500ms a 1s) .
Não há nada no Django que exija um modelo para se comunicar com o backend, ou melhor, com o banco de dados. Eu acho que você está misturando a semântica do que o Django normalmente considera um modelo (ou seja, uma abstração de uma ou várias tabelas no banco de dados) versus o termo modelo como uma construção de design (por exemplo, no Domain Driven Design).
fonte
Daniel Greenfeld, co-autor de "Two Scoops of Django, recomenda que a lógica de negócios deva estar nos modelos" quando possível, ou nas formas, se necessário. "Quanto à possível duplicata de Bart, o django pode ser semelhante ao MVC, mas é Não como MVC Como explicado aqui na documentação oficial do django faq. @adrita, acho que você pode precisar revisar a documentação oficial para ajudá-lo a entender um pouco melhor o conceito de modelos, visualizações e modelos.
fonte
Nos documentos oficiais do Django https://docs.djangoproject.com/en/1.11/ , ele diz:
O Django recomenda que a lógica esteja contida nas visualizações.
fonte
Model.clean()
), está implícito um pouco mais explicitamente que (se simplesmente fizermos um projeto Django do mundo real para modelos, modelos e visualizações) - a lógica de negócios (ou pelo menos a validação) pertencerá ao camada de modelo. Observe que não incluí formulários nessa simplificação, que também são aceitáveis.