091-25-dica-queryset

Dica 25 - Criando Filtros poderosos no Django - Segredos do ORM

http://pythonclub.com.br/django-introducao-queries.html

https://docs.djangoproject.com/en/4.1/ref/models/querysets/

Preparando os dados

python manage.py seed product --number=500
python manage.py seed bookstore --number=500

python manage.py shell_plus
from random import choice

categories = (
    'Acessórios de Moda',
    'Artigos de Ginástica e Esportes',
    'Artigos de Praia e Piscina',
    'Artigos para Presente',
    'Calçado Feminino',
    'Calçado Masculino',
    'Cama, Mesa e Banho',
    'Roupa Feminina',
    'Roupa Infantil',
    'Roupa Masculina',
)

# Deleta as categorias
Category.objects.all().delete()

# Cria as categorias com list comprehension
[Category.objects.create(title=title) for title in categories]

categories = Category.objects.all()
products = Product.objects.all()

for product in products:
    # Escolhe uma catetoria
    category = choice(categories)
    product.category = category

# Aplica a categoria em todos os produtos
Product.objects.bulk_update(products, ['category'])

Relacionamento OneToOne e ForeignKey

Considere o models de Product e Category.

Vamos iterar por todos os produtos. E imprimir o nome da categoria.

Note que foram feitas 500 consultas no banco de dados. E isso torna a nossa query lenta.

Agora faça

O objetivo do select_related é realizar uma única query que une todos os models relacionados. Ele faz isso através de um JOIN na instrução SQL, então realiza o cache do atributo para que possa acessá-lo sem realizar uma nova consulta. Só que ele não funciona para ManyToMany, e nem para Relacionamento Reverso.

Relacionamento Reverso

Por padrão o Django adiciona um relacionamento reverso quando sua tabela é referenciada por uma chave estrangeira.

Se não passar o parâmetro related_name, irá seguir o padrão <nome_tabela>_set.

Significa que a partir da categoria eu consigo acessar todos os produtos.

Exemplo com ManyToMany

Considere o bookstore/models.py

A partir do Livro, vamos acessar todos os autores dele.

A partir do Autor, vamos acessar todos os livros dele.

Filtro Direto

Liste os produtos cuja categoria seja Roupa Masculina. E retorne o título da categoria e o título do produto.

Filtro Reverso

Retorne todas as categorias, e a partir de cada categoria retorne todos os produtos desta categoria.

Filtrando a partir de uma lista de dados

Para filtrar a partir de uma lista de dados usamos o subcomando __in.

Exemplo:

Dada a lista de categorias

Filtre todas as roupas dessas categorias.

Então, façamos

Ordenando os items

Para ordenar os items da query usamos order_by().

Exemplo:

Retornando uma lista de registros

Para retornar uma lista de registros usamos o flat = True.

Exemplo:

Campo de Busca no Django

O Operador AND

Para usar o AND basta separar os parâmetros do filtro com vírgula.

O Operador OR

Método Q()

Para usar o OR vamos precisar do método Q().

Diferença entre get e filter.

O get retorna um objeto.

O filter retorna uma lista.

Tratando o erro DoesNotExists

Evitando o erro DoesNotExists

Retorna um QuerySet vazio.

Você também pode experimentar

get_or_create

https://docs.djangoproject.com/en/4.1/ref/models/querysets/#get-or-create

Na primeira teremos created=True. Na segunda teremos created=False.

Criando o campo de busca

Edite product/views.py

Edite product/templates/product/includes/search.html

Last updated

Was this helpful?