QuerySet
Um QuerySet
representa uma coleção de objetos do banco de dados. Em comparação com SQL, um QuerySet
equivale a um SELECT
. Quando utilizamos o método filter()
de um queryset, adicionamos cláusulas limitantes como WHERE
ou LIMIT
.
Ao usar o QuerySet, fazer diversas operações tipo filter()
não irá acessar o banco de dados. Por exemplo:
users = User.objects.filter(email__icontains='...').filter(is_active=True).filter(...)
Mesmo adicionando vários filtros, o QuerySet
não será computado e, portanto, não irá consultar o banco de dados. Para computar um QuerySet
, é necessário utilizar algum dos métodos: .get()
, .first()
, etc. conforme QuerySet API reference ou usando algum dos métodos para forçar que o QuerySet
seja computado: QuerySet API reference.
Conhecer esses aspectos do QuerySet
é importante para evitar escrever códigos problemáticos como, por exemplo:
ids = [...]
queryset = User.objects.filter(is_active=True)
for id in ids:
user = queryset.get(id=id)
O uso do QuerySet
como no exemplo acima irá executar uma query no banco de dados para cada ID, enquanto que alterando a lógica para que o método .get()
não seja chamado, apenas uma consulta ao banco de dados será realizada:
ids = [...]
queryset = User.objects.filter(is_active=True, id__in=ids)
for user in queryset:
print(user)