- ru
- Language: en
- Documentation version: 2.0
6. How to select some fields only in a queryset?
The auth_user
model has a number of fields in it. But sometimes, you do not need to use all the fields. In such situations, we can query only desired fields.
Django provides two ways to do this
values and values_list methods on queryset.
only_method
Say, we want to get first_name
and last_name
of all the users whose name starts with R. You do not want the fetch the other fields to reduce the work the DB has to do.
>>> 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'}]
You can verify the generated sql using str(queryset.query)
, which gives.
SELECT "auth_user"."first_name", "auth_user"."last_name"
FROM "auth_user" WHERE "auth_user"."first_name"::text LIKE R%
The output will be list of dictionaries.
Alternatively, you can do
>>> queryset = User.objects.filter(
first_name__startswith='R'
).only("first_name", "last_name")
str(queryset.query)
, gives us
SELECT "auth_user"."id", "auth_user"."first_name", "auth_user"."last_name"
FROM "auth_user" WHERE "auth_user"."first_name"::text LIKE R%
The only difference between only
and values
is only
also fetches the id
.