Atualizado: 18/01/2024

Aplicando Filtros - Django

O Django oferece uma ampla gama de ferramentas para aplicar filtros em QuerySets, permitindo a seleção de objetos com base em critérios específicos. Os métodos mais comuns para essa finalidade são get(), filter() e exclude(). Esses métodos recebem como parâmetro uma condição que define o critério do filtro.

Considere o modelo Person como base para os exemplos:

from django.db import models
 
class Person(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField()

get()

O método get() retorna um único objeto que atende ao critério especificado:

tom = Person.objects.get(name="Tom")
print(f"{tom.name} - {tom.age}")

Se nenhum objeto atender ao critério, será lançada a exceção DoesNotExist. Se mais de um objeto corresponder, será lançada a exceção MultipleObjectsReturned.

filter()

O método filter() retorna um QuerySet com todos os objetos que atendem ao critério:

people_by_age = Person.objects.filter(age=32)
for person in people_by_age:
    print(f"{person.name} - {person.age}")

exclude()

O método exclude() retorna um QuerySet com objetos que não atendem ao critério:

people_by_age = Person.objects.exclude(age=32)
for person in people_by_age:
    print(f"{person.name} - {person.age}")

Lookups

Além de filtros básicos, o Django permite condições mais avançadas usando Lookups, que são definidos após o nome do campo, separados por dois sublinhados (__).

exact e iexact

O lookup exact filtra objetos cujo campo corresponde exatamente ao valor fornecido. Sua versão iexact ignora diferenças entre maiúsculas e minúsculas:

tom = Person.objects.get(name__exact="Tom")
people = Person.objects.filter(name__iexact="tom")

O lookup contains filtra objetos cujos campos contêm uma substring específica, enquanto icontains ignora diferenças entre maiúsculas e minúsculas:

people = Person.objects.filter(name__contains="o")
people = Person.objects.filter(name__icontains="T")

contains e icontains

O lookup contains filtra objetos cujos campos contêm uma substring específica, enquanto icontains ignora diferenças entre maiúsculas e minúsculas:

people = Person.objects.filter(name__contains="o")
people = Person.objects.filter(name__icontains="T")

gt, gte, lte, lt

Lookups como gt (maior que), gte (maior ou igual), lt (menor que) e lte (menor ou igual) permitem filtrar objetos com base em valores numéricos:

people = Person.objects.filter(age__lte=32)
people = Person.objects.filter(age__gt=40)

range

O lookup range filtra objetos com valores dentro de um intervalo:

people = Person.objects.filter(age__range=(28, 38))

in

O lookup in retorna objetos cujos campos correspondem a um conjunto de valores:

# Retorna pessoas com 28, 32 ou 38 anos
people = Person.objects.filter(age__in=[28, 32, 38])

isnull

O lookup isnull filtra objetos com campos nulos ou não nulos, dependendo do valor fornecido:

people = Person.objects.filter(name__isnull=True)
people = Person.objects.filter(age__isnull=False)

startswith e istartswith

O lookup startswith filtra objetos cujos campos começam com uma substring específica, enquanto istartswith ignora diferenças entre maiúsculas e minúsculas:

people = Person.objects.filter(name__startswith="T")
people = Person.objects.filter(name__istartswith="t")

regex e iregex

O lookup regex filtra objetos com base em expressões regulares, enquanto iregex ignora diferenças entre maiúsculas e minúsculas:

people = Person.objects.filter(name__regex=r"(am|om)$")

Filtros de Data

Filtros para campos de data e hora incluem lookups como year, month, day, hour, entre outros. Considere o modelo Order com um campo de data e hora:

from django.db import models

class Order(models.Model):
    datetime = models.DateTimeField()

Exemplo de filtro por mês:

from datetime import datetime

orders = Order.objects.filter(datetime__month=5)
for order in orders:
    print(order.datetime)

Filtros mais complexos também podem ser combinados, como datetime__month__gt=5, para retornar objetos após o quinto mês.

Operadores Lógicos

Os operadores lógicos permitem combinar filtros. Os principais são:

  • AND (&): Retorna objetos que atendem a ambos os critérios.

  • OR (|): Retorna objetos que atendem a pelo menos um dos critérios.

  • XOR (^): Retorna objetos que atendem a apenas um dos critérios, mas não ambos.

Exemplo com AND:

people = Person.objects.filter(name="Tom") & Person.objects.filter(age=22)

No nível do banco de dados, isso corresponde a:

SELECT * FROM person WHERE name = 'Tom' AND age = 22;

Exemplo com OR:

people = Person.objects.filter(name="Tom") | Person.objects.filter(age=22)
E com XOR:
people = Person.objects.filter(name="Tom") ^ Person.objects.filter(age=22)
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com