Aplicando Filtros no 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)
Documentação oficial: