Ordenando e Recuperando Registros no Django
No Django, os métodos order_by
, values
e values_list
são ferramentas essenciais para manipulação de dados em QuerySets. Eles permitem ordenar resultados e otimizar consultas ao retornar apenas subconjuntos específicos de dados diretamente do banco de dados, sem a necessidade de criar instâncias completas dos modelos.
order_by
O método order_by
é usado para ordenar os resultados de uma consulta com base em campos específicos. Para ordenar os objetos em ordem crescente, basta informar o nome do campo:
from .models import Person
# Ordenação crescente pelo nome
people = Person.objects.order_by("name")
for person in people:
print(person.name)
Se for necessário ordenar por mais de um campo, basta passar os nomes dos campos como argumentos. A ordenação será aplicada na sequência definida:
# Ordenação por nome e, em seguida, por idade
people = Person.objects.order_by("name", "age")
Para ordenar em ordem decrescente, basta adicionar o prefixo -
ao nome do campo:
# Ordenação decrescente pelo nome
people = Person.objects.order_by("-name")
values
O método values
é usado para retornar um QuerySet contendo dicionários com os valores dos campos especificados. Isso permite otimizar a consulta ao retornar apenas os dados necessários, sem a necessidade de instanciar objetos completos do modelo.
Por exemplo:
from .models import Person
# Retorna todos os campos como dicionário
people = Person.objects.values()
print(people)
# Resultado
# <QuerySet [{'id': 1, 'name': 'Bob', 'age': 42}, {'id': 2, 'name': 'Tom', 'age': 38}]>
Se forem necessários apenas alguns campos, eles podem ser especificados:
# Retorna apenas os campos "id" e "name"
people = Person.objects.values("id", "name")
print(people)
# Resultado
# <QuerySet [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}]>
values_list
O método values_list
funciona de forma semelhante ao values, mas retorna um QuerySet onde cada item é representado como uma tupla com os valores dos campos especificados.
Por exemplo:
from .models import Person
# Retorna todos os campos como tuplas
people = Person.objects.values_list()
print(people)
# Resultado
# <QuerySet [(1, 'Bob', 42), (2, 'Tom', 38)]>
Se forem necessários apenas alguns campos, eles podem ser especificados:
# Retorna apenas os campos "id" e "name"
people = Person.objects.values_list("id", "name")
print(people)
# Resultado
# <QuerySet [(1, 'Bob'), (2, 'Tom')]>
Se apenas um campo for selecionado, o resultado será um conjunto de tuplas com um único valor em cada tupla. Para simplificar esse formato, o parâmetro flat=True
pode ser usado, retornando os valores como uma lista simples:
# Retorna apenas o campo "name" como lista simples
people = Person.objects.values_list("name", flat=True)
print(people)
# Resultado
# <QuerySet ['Bob', 'Tom']>
Documentação oficial: