6. Как выбрать только некоторые поля в наборе запросов?

../_images/usertable.png

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

Django предоставляет два способа сделать это

  • Методы values и values_list на queryset.

  • only_method

Скажем, мы хотим получить first_name и last_name всех пользователей, чье имя начинается с R. Вы не хотите получать другие поля, чтобы уменьшить объем работы БД.

>>> queryset = User.objects.filter(
    first_name__startswith='R'
).values('first_name', 'last_name')
>>> queryset
<QuerySet [{'first_name': 'Ricky', 'last_name': 'Dayal'}, {'first_name': 'Ritesh', 'last_name': 'Deshmukh'}, {'first_name': 'Radha', 'last_name': 'George'}, {'first_name': 'Raghu', 'last_name': 'Khan'}, {'first_name': 'Rishabh', 'last_name': 'Deol'}]

Вы можете проверить сгенерированный sql, используя str(queryset.query), что дает.

SELECT "auth_user"."first_name", "auth_user"."last_name"
FROM "auth_user" WHERE "auth_user"."first_name"::text LIKE R%

Результатом будет список словарей.

В качестве альтернативы вы можете сделать

>>> queryset = User.objects.filter(
    first_name__startswith='R'
).only("first_name", "last_name")

str(queryset.query), дает нам

SELECT "auth_user"."id", "auth_user"."first_name", "auth_user"."last_name"
FROM "auth_user" WHERE "auth_user"."first_name"::text LIKE R%

Единственное различие между only и values заключается в том, что only также забирает id.

Вернуться на верх