[Django] #29072: only()/defer() vs select_related()

10 views
Skip to first unread message

Django

unread,
Jan 26, 2018, 12:02:18 PM1/26/18
to django-...@googlegroups.com
#29072: only()/defer() vs select_related()
-------------------------------------+-------------------------------------
Reporter: Дилян | Owner: nobody
Палаузов |
Type: New | Status: new
feature |
Component: Database | Version: master
layer (models, ORM) |
Severity: Normal | Keywords:
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
Provided
{{{
class M(models.Model):
n = models.IntegerField()
r = models.IntegerField()
t = models.IntegerField()
s = models.IntegerField()
u = models.IntegerField()

class F(models.Model):
g = models.ForeignKey(M, on_delete=models.CASCADE)
a = models.IntegerField()
b = models.IntegerField()
c = models.IntegerField()
d = models.IntegerField()
e = models.IntegerField()
}}}


I want to obtain with a queryset all fields from F and M.n, but not the
other fields of M like M.r. This works
{{{F.objects.select_related('g').defer('g__r', 'g__t', 'g__s', 'g__u')}}}
but I don't like it, as I want to say only M.n has to be obtained, and not
the others. prefetch_related is also suboptimal, as it creates two SQL
queries instead of one. {{{only()}}} does not let me specify 'All fields
of F'.

{{{F.objects.select_related('g__n')}}} would fit from logic, but does not
work ({{{django.core.exceptions.FieldError: Non-relational field given in
select_related: 'n'. Choices are: (none)}}})

Please make {{{select_related()}}} accept the above expression.

This applies to both master and 1.11.

--
Ticket URL: <https://code.djangoproject.com/ticket/29072>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Jan 26, 2018, 12:14:12 PM1/26/18
to django-...@googlegroups.com
#29072: Allow select_related() to fetch individual fields from a related model
-------------------------------------+-------------------------------------
Reporter: Дилян Палаузов | Owner: nobody
Type: New feature | Status: closed
Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution: wontfix
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Tim Graham):

* status: new => closed
* resolution: => wontfix


Comment:

I'm not in love with the proposed API. Giving `select _related()` the
ability to fetch individual fields doesn't seem like a proper separation
of concerns (that's what `only()` is for). You could raise a discussion on
the DevelopersMailingList to see if consensus emerges about a more elegant
solution.

--
Ticket URL: <https://code.djangoproject.com/ticket/29072#comment:1>

Django

unread,
Jan 26, 2018, 7:00:33 PM1/26/18
to django-...@googlegroups.com
#29072: Allow select_related() to fetch individual fields from a related model
-------------------------------------+-------------------------------------
Reporter: Дилян Палаузов | Owner: nobody
Type: New feature | Status: closed
Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution: wontfix
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by Tim Graham):

[https://groups.google.com/d/topic/django-
developers/XSiGQWI1TNs/discussion django-developers thread]

--
Ticket URL: <https://code.djangoproject.com/ticket/29072#comment:2>

Django

unread,
Sep 5, 2019, 3:50:43 PM9/5/19
to django-...@googlegroups.com
#29072: Allow select_related() to fetch individual fields from a related model
-------------------------------------+-------------------------------------
Reporter: Дилян Палаузов | Owner: nobody
Type: New feature | Status: closed
Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution: wontfix
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by Lev Lybin):

I was looking for how to more elegant reduce joined query what author
talk, and not found good solution, list all unneeded fields of joined
table in 'defer' is not elegant solution. At this moment django doesn't
has it. If look on how can customize prefetch_related with Prefetch() I
have suggestion create e.g. 'Select' for select_related and use it like
that: select_related('g') or select_related(Select('g').only('r', 't',
's', 'u'))

--
Ticket URL: <https://code.djangoproject.com/ticket/29072#comment:3>

Reply all
Reply to author
Forward
0 new messages