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

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Django
#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.

--
You received this message because you are subscribed to the Google Groups "Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/057.d931b9e46352a7da0f25ced76f329289%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [Django] #29072: Allow select_related() to fetch individual fields from a related model (was: only()/defer() vs select_related())

Django
#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 <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

--
You received this message because you are subscribed to the Google Groups "Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/072.72a05749de9723ee4b65b6e83b4e9756%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [Django] #29072: Allow select_related() to fetch individual fields from a related model

Django
In reply to this post by Django
#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 <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

--
You received this message because you are subscribed to the Google Groups "Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/072.fb163815b34e36047f0013e0db1769a0%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [Django] #29072: Allow select_related() to fetch individual fields from a related model

Django
In reply to this post by Django
#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>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

--
You received this message because you are subscribed to the Google Groups "Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/072.b9c9fd2392f5d0415643267f4b6fa1cc%40djangoproject.com.