include only columns from selected related models in select_related query

169 views
Skip to first unread message

Riccardo Magliocchetti

unread,
Feb 11, 2019, 5:50:18 AM2/11/19
to django-d...@googlegroups.com
Hello,

I'm debugging views leaking lots of memory in django 1.11. It looks like there
is some connections with my usage of select_related(). But that's mail is not
about that, not sure about my findings yet :)

So I have looked again at the select_related documentation here:
https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related

and found this:
Book.objects.select_related('author__hometown').get(id=4) will cache the related
Person and the related City

Up until now i thought that only the related model i've specified would get
added to selected columns e.g. only the City because of hometown. But it looks
that's not how it is :)

Would it make sense to add a parameter to change select_related behaviour to
include only the columns of the related models specified? That could save quite
a lot of bandwitdh for some use cases.

What do you think?

Thanks

--
Riccardo Magliocchetti
@rmistaken

http://menodizero.it

Collin Anderson

unread,
Feb 11, 2019, 11:36:19 AM2/11/19
to django-d...@googlegroups.com
So would you "defer" the other columns like "only()"?

If nothing else, you could try using .annotate(F('author__hometown')) (not sure if that works) or .values('author__hometown') to just get the values you need.

--
You received this message because you are subscribed to the Google Groups "Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To post to this group, send email to django-d...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-developers.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/a42050d3-25a2-2f47-c841-918d7d085757%40gmail.com.
For more options, visit https://groups.google.com/d/optout.

Riccardo Magliocchetti

unread,
Feb 11, 2019, 11:48:00 AM2/11/19
to django-d...@googlegroups.com
Hello Collin,

Il 11/02/19 17:35, Collin Anderson ha scritto:
> So would you "defer" the other columns like "only()"?

Yeah, something like that

> If nothing else, you could try using .annotate(F('author__hometown')) (not
> sure if that works) or .values('author__hometown') to just get the values
> you need.

Sure but the query would be everything but readable :)
The point of a parameter to select_related would be to avoid to type explicitly
fields not in select_related and the one in select_related twice.

Josh Smeaton

unread,
Feb 13, 2019, 8:54:04 AM2/13/19
to Django developers (Contributions to Django itself)
Personally, I depend on this behaviour, but it's only because I'm aware of it. Others would be too though, so we can't just make that change (not that you're suggesting that approach).

One approach I think could be good would be:

Book.objects.select_related('author__hometown').defer("author").get(id=4)

Deferring a relation would defer all fields except the key field (which is necessary for lazy loading). What do you think?
Reply all
Reply to author
Forward
0 new messages