Deslocamento de limite do Django

Resumo : neste tutorial, você aprenderá como limitar a QuerySetno Django, que é equivalente às cláusulas LIMITand do SQL OFFSET.

Na prática, raramente você obtém todas as linhas de uma ou mais tabelas do banco de dados. Em vez disso, você obtém um subconjunto de linhas para exibição em uma página da web.

Django usa a sintaxe de fatiamento para limitar QuerySeta um número específico de objetos. Nos bastidores, o Django executa uma SELECTinstrução SQL com cláusulas LIMITe OFFSET.

Suponha que você queira acessar as 10 primeiras linhas de uma tabela, você pode usar o seguinte fatiamento:

Entity.objects.all()[:10]Linguagem de código:  Python  ( python )

Como a tabela armazena as linhas em uma ordem não especificada, os “10 primeiros objetos” tornam-se imprevisíveis.

Portanto, você deve sempre classificar os resultados antes de fatiar a consulta. Por exemplo, o seguinte obtém as primeiras 10 linhas ordenadas por field_name:

Entity.objects.all().order_by(field_name)[:10]Linguagem de código:  Python  ( python )

Para obter as linhas de 10 a 20, você pode usar o seguinte fatiamento:

Entity.objects.all().order_by(field_name)[10:20]Linguagem de código:  Python  ( python )

Em geral, a sintaxe para limitar os resultados é a seguinte:

Entity.objects.all()[Offset:Offset+Limit]Linguagem de código:  Python  ( python )

Nesta sintaxe, Offseté o número de linhas que você deseja ignorar e Limité o número de linhas que deseja recuperar.

Observe que o Django não suporta indexação negativa como:

Entity.objects.all().order_by(field_name)[-10]Linguagem de código:  Python  ( python )

Além disso, quando você fatia um QuerySet, o Django retorna um novo QuerySet.

Para recuperar a primeira ou a última linha, você deve usar o método first()ou last()porque se QuerySetestiver vazio e você usar uma fatia:

Entity.objects.all().order_by(field_name)[0]Linguagem de código:  Python  ( python )

…então você receberá uma IndexErrorexceção.

Exemplo de deslocamento de limite do Django

Usaremos o Employeemodelo do HRaplicativo para demonstração. O Employeemodelo é mapeado para a hr_employeetabela:

O exemplo a seguir obtém os primeiros 10 funcionários ordenados pelos seus primeiros nomes:

>>> Employee.objects.all().order_by('first_name')[:10] 
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name",
       "hr_employee"."contact_id",
       "hr_employee"."department_id"
  FROM "hr_employee"
 ORDER BY "hr_employee"."first_name" ASC
 LIMIT 10
Execution time: 0.000000s [Database: default]
<QuerySet [<Employee: Aaron Pearson>, <Employee: Adam Crane>, <Employee: Adam Stewart>, <Employee: Adrienne Green>, <Employee: Alan Johnson>, <Employee: Alexa West>, <Employee: Alicia Wyatt>, <Employee: Amanda Benson>, <Employee: Amber Brown>, <Employee: Amy Lopez>]>Linguagem de código:  Python  ( python )

O exemplo a seguir ignora as primeiras 10 linhas e obtém as próximas 10 linhas da hr_employeetabela:

>>> Employee.objects.order_by('first_name')[10:20] 
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name",
       "hr_employee"."contact_id",
       "hr_employee"."department_id"
  FROM "hr_employee"
 ORDER BY "hr_employee"."first_name" ASC
 LIMIT 10
OFFSET 10
Execution time: 0.001001s [Database: default]
<QuerySet [<Employee: Amy Lee>, <Employee: Andre Perez>, <Employee: Andrea Mcintosh>, <Employee: Andrew Dixon>, <Employee: Andrew Guerra>, <Employee: Ann Chang>, 
<Employee: Anne Odom>, <Employee: Anthony Fuentes>, <Employee: Anthony Welch>, <Employee: Ashley Brown>]>Linguagem de código:  Python  ( python )

Resumo

  • Django usa sintaxe de divisão de array para limitar o número de objetos retornados por um arquivo QuerySet.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *