values(*fields)
Returns a QuerySet
that returns dictionaries, rather than model instances, when used as an iterable.
Each of those dictionaries represents an object, with the keys corresponding to the attribute names of model objects.
This example compares the dictionaries of values()
with the normal model objects:
# This list contains a Blog object. >>> Blog.objects.filter(name__startswith='Beatles') <QuerySet [<Blog: Beatles Blog>]> # This list contains a dictionary. >>> Blog.objects.filter(name__startswith='Beatles').values() <QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
The values()
method takes optional positional arguments, *fields
, which specify field names to which the SELECT
should be limited. If you specify the fields, each dictionary will contain only the field keys/values for the fields you specify. If you don’t specify the fields, each dictionary will contain a key and value for every field in the database table.
Example:
>>> Blog.objects.values() <QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]> >>> Blog.objects.values('id', 'name') <QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
A few subtleties that are worth mentioning:
-
If you have a field called
foo
that is aForeignKey
, the defaultvalues()
call will return a dictionary key calledfoo_id
, since this is the name of the hidden model attribute that stores the actual value (thefoo
attribute refers to the related model). When you are callingvalues()
and passing in field names, you can pass in eitherfoo
orfoo_id
and you will get back the same thing (the dictionary key will match the field name you passed in).For example:
>>> Entry.objects.values() <QuerySet [{'blog_id': 1, 'headline': 'First Entry', ...}, ...]> >>> Entry.objects.values('blog') <QuerySet [{'blog': 1}, ...]> >>> Entry.objects.values('blog_id') <QuerySet [{'blog_id': 1}, ...]>
- When using
values()
together withdistinct()
, be aware that ordering can affect the results. See the note indistinct()
for details. - If you use a
values()
clause after anextra()
call, any fields defined by aselect
argument in theextra()
must be explicitly included in thevalues()
call. Anyextra()
call made after avalues()
call will have its extra selected fields ignored. - Calling
only()
anddefer()
aftervalues()
doesn’t make sense, so doing so will raise aNotImplementedError
.
It is useful when you know you’re only going to need values from a small number of the available fields and you won’t need the functionality of a model instance object. It’s more efficient to select only the fields you need to use.
Finally, note that you can call filter()
, order_by()
, etc. after the values()
call, that means that these two calls are identical:
Blog.objects.values().order_by('id') Blog.objects.order_by('id').values()
The people who made Django prefer to put all the SQL-affecting methods first, followed (optionally) by any output-affecting methods (such as values()
), but it doesn’t really matter. This is your chance to really flaunt your individualism.
You can also refer to fields on related models with reverse relations through OneToOneField
, ForeignKey
and ManyToManyField
attributes:
>>> Blog.objects.values('name', 'entry__headline') <QuerySet [{'name': 'My blog', 'entry__headline': 'An entry'}, {'name': 'My blog', 'entry__headline': 'Another entry'}, ...]>
Warning
Because ManyToManyField
attributes and reverse relations can have multiple related rows, including these can have a multiplier effect on the size of your result set. This will be especially pronounced if you include multiple such fields in your values()
query, in which case all possible combinations will be returned.
Please login to continue.