Eu gosto de Django. É uma estrutura bem pensada e intuitiva, com um nome que posso pronunciar em voz alta. Você pode usá-lo para girar rapidamente um projeto final de semanae você também pode usá-lo para executar aplicações de produção completas em escala.

Eu fiz essas duas coisas e, ao longo dos anos, descobri como usar alguns dos recursos do Django para obter a máxima eficiência. Esses são:

  • Visualizações baseadas em classes versus funções
  • Modelos Django
  • Recuperando Objetos com Consultas

Vejamos como essas ferramentas permitem criar um aplicativo Django com desempenho agradável de criar e manter.

Visualizações baseadas em classes versus funções

Lembre-se de que o Django é todo Python oculto. Quando se trata de visualizações, você tem duas opções: visualizar funções (às vezes chamado de “visualizações baseadas em funções”) ou visualizações baseadas em classe.

Anos atrás, quando eu construí ApplyByAPI, foi inicialmente composto inteiramente de visualizações baseadas em funções. Eles oferecem controle granular e são bons para implementar lógica complexa. Assim como em uma função Python, você tem controle total (para o bem ou para o mal) sobre o que a exibição faz.

Mas com grande controle, há grande responsabilidade, e as visualizações baseadas em funções podem ser um pouco entediantes de usar. Você é responsável por escrever todos os métodos necessários para que a exibição funcione – é isso que permite adaptar completamente seu aplicativo.

No caso do ApplyByAPI, havia apenas alguns locais esparsos em que esse nível de funcionalidade personalizada era realmente necessário. Em qualquer outro lugar, as visões baseadas em funções começaram a dificultar minha vida. Escrever o que é essencialmente uma exibição personalizada para operações comuns, como exibir dados em uma página da lista, tornou-se entediante, repetitivo e propenso a erros.

Com visões baseadas em funções, você precisará descobrir quais métodos do Django implementar para lidar com solicitações e passar dados para as visões. O teste de unidade pode levar algum trabalho para escrever. Em resumo, o controle granular que as visualizações baseadas em funções oferecem também requer algum tédio granular para implementar adequadamente.

Acabei retendo o ApplyByAPI enquanto refatorava a maioria das visualizações em visualizações baseadas em classe. Não foi uma pequena quantidade de trabalho e refatoração, mas quando isso foi feito, eu tive várias visualizações minúsculas que fizeram uma enorme diferença. Quero dizer, basta olhar para este:

class ApplicationsList(ListView):    model = Application    template_name = "applications.html"

São três linhas. Minha ergonomia para desenvolvedores e minha vida ficaram muito mais fáceis.

Você pode pensar em modos de exibição baseados em classe como modelos que cobrem a maioria das funcionalidades que qualquer aplicativo precisa. Existem modos de exibição para exibir listas de itens, para exibir itens em detalhes e edição de vistas para executar operações CRUD (Criar, Ler, Atualizar, Excluir).

Como a implementação de uma dessas visualizações genéricas requer apenas algumas linhas de código, a lógica da minha aplicação se tornou dramaticamente sucinta. Isso me deu menos código repetido, menos lugares para que algo desse errado e um aplicativo mais gerenciável em geral.

As visualizações baseadas em classe são rápidas de implementar e usar. As visualizações genéricas baseadas em classe incorporadas podem exigir menos trabalho para serem testadas, pois você não precisa escrever testes para a exibição base que o Django fornece. (O Django faz seus próprios testes para isso; não é necessário que seu aplicativo verifique novamente.)

Para ajustar uma visão genérica às suas necessidades, você pode subclasse uma visão genérica e substituir atributos ou métodos. No meu caso, como eu só precisava escrever testes para quaisquer personalizações adicionadas, meus arquivos de teste ficaram muito mais curtos, assim como o tempo e os recursos necessários para executá-los.

Ao ponderar a escolha entre visualizações baseadas em função ou classe, considere a quantidade de personalização necessária para a visualização e o trabalho futuro necessário para testá-la e mantê-la.

Se a lógica for comum, você poderá atingir o terreno com uma visão genérica baseada em classe. Se você precisar de granularidade suficiente para que a reescrita dos métodos de uma visão básica a torne excessivamente complicada, considere uma visão baseada em funções.

Modelos Django

Modelos organize os conceitos centrais do seu aplicativo Django para ajudá-lo a ser flexível, robusto e fácil de trabalhar. Se usados ​​com sabedoria, os modelos são uma maneira poderosa de agrupar seus dados em uma fonte definitiva de verdade.

Como as visualizações, o Django fornece alguns tipos de modelo internos para a conveniência de implementar autenticação básica, incluindo o Do utilizador e Permissão modelos. Para todo o resto, você pode criar um modelo que reflita seu conceito herdando de uma classe Model pai.

class StaffMember(models.Model):    user = models.OneToOneField(User, on_delete=models.CASCADE)    company = models.OneToOneField(Company, on_delete=models.CASCADE)    def __str__(self):        return self.company.name + " - " + self.user.email

Quando você cria um modelo personalizado no Django, você subclassifica Classe Model do Django e tirar proveito de todo o seu poder. Cada modelo que você cria geralmente mapeia para uma tabela de banco de dados. Cada atributo é um campo de banco de dados. Isso lhe dá a capacidade de criar objetos para trabalhar com que os humanos possam entender melhor.

Você pode tornar um modelo útil definindo seus campos. Muitos tipos de campo embutidos são convenientemente fornecidos. Isso ajuda o Django a descobrir o tipo de dados, o HTML ferramenta usar ao renderizar um formulário e até validação de formulário requisitos. Se precisar, você pode escrever campos de modelo personalizado.

Base de dados relacionamentos pode ser definido usando um ForeignKey campo (muitos-para-um) ou um ManyToManyField (dê três palpites). Se isso não bastar, há também uma OneToOneField.

Juntos, eles permitem definir relações entre seus modelos com níveis de complexidade limitados apenas pela sua imaginação. (Dependendo da imaginação que você tem, isso pode ou não ser uma vantagem.)

Recuperando Objetos com Consultas

Use o gerente do seu modelo (objects por padrão) para construir um QuerySet. Essa é uma representação dos objetos em seu banco de dados que você pode refinar, usando métodos, para recuperar subconjuntos específicos. Todos os métodos disponíveis estão no API QuerySet e podem ser encadeados para ainda mais diversão.

Post.objects.filter(    type="new").exclude(    title__startswith="Blockchain")

Alguns métodos retornam novos QuerySets, como filter()ou exclude(). Encadear essas informações pode fornecer consultas poderosas sem afetar o desempenho, pois o QuerySets não é buscado no banco de dados até que sejam avaliados. Os métodos que avaliam um QuerySet incluem get(), count(), len(), list()ou bool().

A iteração sobre um QuerySet também a avalia; evite fazê-lo sempre que possível para melhorar o desempenho da consulta. Por exemplo, se você quer apenas saber se um objeto está presente, pode usar exists() para evitar a iteração sobre objetos de banco de dados.

Usar get() nos casos em que você deseja recuperar um objeto específico. Este método gera MultipleObjectsReturned se algo inesperado acontecer, bem como o DoesNotExist exceção, se, adivinhe.

Se você deseja obter um objeto que pode não existir no contexto da solicitação de um usuário, use o conveniente get_object_or_404() ou get_list_or_404() o que gera Http404 ao invés de DoesNotExist. Estes úteis atalhos são adequados apenas para esse propósito. Para criar um objeto que não existe, há também o conveniente get_or_create().

Fundamentos eficientes

Agora você tem um controle sobre essas três ferramentas essenciais para criar seu aplicativo Django eficiente – parabéns!

O Django pode fazer muito mais por você, portanto, fique atento a artigos futuros.

Se você for construir no GitHub, poderá configurar meu Ação do GitHub do django-security-check. Enquanto isso, você está no caminho certo para criar um belo projeto de software.



Fonte