• en
  • Language: ru
  • Documentation version: 2.0

11. Как найти вторую по величине запись с помощью Django ORM?

Вы можете столкнуться с ситуацией, когда вам нужно найти второго пользователя по возрасту или зарплате.

Хотя ORM дает возможность найти first(), last() элемент из кверисета, но не n-й элемент. Это можно сделать с помощью оператора slice.

../_images/usertable.png

Мы можем найти N-е количество записей из запроса с помощью оператора slice.

>>> user = User.objects.order_by('-last_login')[1] // Second Highest record w.r.t 'last_login'
>>> user.first_name
'Raghu'
>>> user = User.objects.order_by('-last_login')[2] // Third Highest record w.r.t 'last_login'
>>> user.first_name
'Sohan'

User.objects.order_by('-last_login')[2] извлекает нужный объект из базы данных только с помощью LIMIT ... OFFSET. Если вы посмотрите на сгенерированный sql, вы увидите что-то вроде этого.

SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
FROM "auth_user"
ORDER BY "auth_user"."last_login" DESC
LIMIT 1
OFFSET 2