Daniil Ryzhkov
Daniil Ryzhkov

Reputation: 7596

Django gets unnecessary fields executing QuerySet

This QuerySet (Let's say Model model has 12 field):

objects = Model.objects.filter(...)

And this template:

{% for object in object %}
<a href='{{ object.get_absolut_url }}'>Foo: {{ object.bar }}</a>
{% endfor %}

perform SQL query which gets unnecessary fields (every 12 fields + relations). I want Django to get only 'bar' field. How can I do this?

By the way I know about values() method, but as it returns dict, I can't call Model methods such as get_absolute_url().

Upvotes: 0

Views: 600

Answers (1)

Frank Wiles
Frank Wiles

Reputation: 1608

You want to use only():

objects = Model.objects.select_related().only("bar").filter(...)

Keep in mind however if you limit too much of the data down and then use the objects in other ways you can actually cause the ORM to execute extra queries, so make sure to be using something like django-debug-toolbar to ensure you aren't removing these unnecessary fields to only incur the hit of lots of unnecessary queries which is a worse situation.

FYI you can also use defer() to list the fields you don't want loaded if you want to think about it in the other direction.

Upvotes: 1

Related Questions