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()
exclude()
Considere o modelo Person
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
get()
O método get()
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
MultipleObjectsReturned
filter()
O método filter()
QuerySet
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()
QuerySet
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
iexact
tom = Person.objects.get(name__exact="Tom")
people = Person.objects.filter(name__iexact="tom")
O lookup contains
icontains
people = Person.objects.filter(name__contains="o")
people = Person.objects.filter(name__icontains="T")
contains e icontains
O lookup contains
icontains
people = Person.objects.filter(name__contains="o")
people = Person.objects.filter(name__icontains="T")
gt, gte, lte, lt
Lookups como gt
gte
lt
lte
people = Person.objects.filter(age__lte=32)
people = Person.objects.filter(age__gt=40)
range
O lookup range
people = Person.objects.filter(age__range=(28, 38))
in
O lookup in
# Retorna pessoas com 28, 32 ou 38 anos
people = Person.objects.filter(age__in=[28, 32, 38])
isnull
O lookup isnull
people = Person.objects.filter(name__isnull=True)
people = Person.objects.filter(age__isnull=False)
startswith e istartswith
O lookup startswith
istartswith
people = Person.objects.filter(name__startswith="T")
people = Person.objects.filter(name__istartswith="t")
regex e iregex
O lookup regex
iregex
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
Order
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
Operadores Lógicos
Os operadores lógicos permitem combinar filtros. Os principais são:
: Retorna objetos que atendem a ambos os critérios.AND (&)
: Retorna objetos que atendem a pelo menos um dos critérios.OR (|)
: Retorna objetos que atendem a apenas um dos critérios, mas não ambos.XOR (^)
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)
XOR
people = Person.objects.filter(name="Tom") ^ Person.objects.filter(age=22)