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_plusfrom 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.
select_related
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.
prefetch_related
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
ANDPara usar o AND basta separar os parâmetros do filtro com vírgula.
O Operador OR
ORMétodo Q()
Q()Para usar o OR vamos precisar do método Q().
Diferença entre get e filter.
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?