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

Existe diferença nos códigos ao implementar a view de buscar

O código ensinado na aula é o seguinte:

def buscar(request):
    fotografias = Fotografia.objects.order_by('data_fotografia').filter(publicada=True)

    if 'buscar' in request.GET:
        nome_a_buscar = request.GET['buscar']
        if nome_a_buscar:
            fotografias = fotografias.filter(nome__icontains=nome_a_buscar)

    return render(request, 'galeria/buscar.html', {'cards': fotografias})

Como alternativa, escrevi o seguinte:

def buscar(request):
    fotografias = []

    if 'buscar' in request.GET:
        nome_a_buscar = request.GET['buscar']
        if nome_a_buscar:
            fotografias = Fotografia.objects.order_by('data_fotografia').filter(publicada=True).filter(nome__icontains=nome_a_buscar)

    return render(request, 'galeria/buscar.html', {'cards': fotografias})

Existe alguma diferença de desempenho entre eles? A mim, parece que buscar as fotografias no banco de dados já com o filtro da busca é mais eficiente do que buscar todas as fotografias e depois filtrar. O que vocês acham?

2 respostas
solução!

Olá, Fábio!

Sua dúvida é muito pertinente e mostra que você está pensando na eficiência do código, e isso é ótimo!

Diferenças e Desempenho

  1. Execução Condicional: No seu código, a consulta ao banco de dados só é feita se houver um termo de busca (nome_a_buscar). No código da aula, a consulta inicial (Fotografia.objects.order_by('data_fotografia').filter(publicada=True)) é sempre executada, independentemente de haver ou não um termo de busca. Isso pode ser mais eficiente no seu caso, pois evita uma consulta desnecessária quando não há busca.

  2. Filtragem: No código da aula, a filtragem é feita em duas etapas: primeiro, busca todas as fotografias publicadas e ordenadas, e depois aplica o filtro do nome se houver um termo de busca. No seu código, a filtragem é feita de uma vez só, diretamente na consulta inicial, o que pode ser mais eficiente em termos de desempenho, pois evita a criação de um conjunto intermediário de dados.

Considerações Finais

A sua abordagem pode ser mais eficiente porque evita uma consulta inicial desnecessária quando não há termo de busca e aplica todos os filtros de uma vez só. No entanto, a diferença de desempenho pode ser mínima dependendo do tamanho do seu banco de dados e da frequência com que a busca é realizada.

Espero ter ajudado e bons estudos!

Obrigado!