[Django] #20927: Include known related fields for subclassed "QuerySet.only"

3 views
Skip to first unread message

Django

unread,
Aug 16, 2013, 2:17:57 AM8/16/13
to django-...@googlegroups.com
#20927: Include known related fields for subclassed "QuerySet.only"
-------------------------------------+-------------------------------------
Reporter: lvo@… | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 1.5
(models, ORM) | Keywords: queryset, only, related
Severity: Normal | manager, manager
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
I have a model like these:

{{{
#!python
class PNRSegment(models.Model):
pnr = models.ForeignKey('booking.PassengerNameRecord',
related_name="segments")
arrival_datetime = models.DateTimeField()

objects = PNRSegmentManager()
}}}

Also i wrote my own Manager with own QuerySet:

{{{
#!python
class PNRSegmentManager(models.Manager):
use_for_related_fields = True

def get_query_set(self):
return PNRSegmentQuerySet(self.model, using=self._db)

def latest_datetime(self):
return self.get_query_set().latest_datetime()


class PNRSegmentQuerySet(QuerySet):
def latest_datetime(self):
try:
return self.order_by('-arrival_datetime')[0].arrival_datetime
except IndexError:
return None

}}}

I noticed that `QuerySet.only` has strange behavior:
{{{
#!python
# When launching pdb into PNRSegmentQuerySet.latest_datetime:
(Pdb) pp self
[<PNRSegment: PNRSegment object>, <PNRSegment: PNRSegment object>]
(Pdb) pp self.count()
2
(Pdb) pp self[0]
<PNRSegment: PNRSegment object>
(Pdb) pp self.only('arrival_datetime').count()
2
(Pdb) pp self.only('arrival_datetime')[0]
*** IndexError: IndexError(("PNRSegment matching query does not exist.
Lookup parameters were {'pk': None}",),)
}}}

After tracing of `QuerySet.clone` i found my error: when subclassing
QuerySet for related manager, each `QuerySet.only` call should contain
related field:
{{{
#!python
(Pdb) pp self.only('arrival_datetime', 'pnr')[0]
<PNRSegment_Deferred_airline_code_class_code_ ... cutted ...>
}}}

I think that this is not obvious behaviour. `QuerySet.only` should
authomatically include all fields from `QuerySet._known_related_objects`.

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

Django

unread,
Sep 6, 2013, 12:22:27 PM9/6/13
to django-...@googlegroups.com
#20927: Include known related fields for subclassed "QuerySet.only"
-------------------------------------+-------------------------------------
Reporter: lvo@… | Owner: nobody
Type: Bug | Status: closed

Component: Database layer | Version: 1.5
(models, ORM) | Resolution: invalid
Severity: Normal | Triage Stage:
Keywords: queryset, only, | Unreviewed
related manager, manager | Needs documentation: 0
Has patch: 0 | Patch needs improvement: 0
Needs tests: 0 | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------
Changes (by sduveen):

* status: new => closed
* needs_docs: => 0
* resolution: => invalid
* needs_tests: => 0
* needs_better_patch: => 0


Comment:

only() is about the fields returned. It's specifically used to limit
fields and you use it so that it won't include additional ones. If you
want defaults, then don't use only()

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

Django

unread,
Sep 6, 2013, 12:26:35 PM9/6/13
to django-...@googlegroups.com
#20927: Include known related fields for subclassed "QuerySet.only"
-------------------------------------+-------------------------------------
Reporter: lvo@… | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 1.5
(models, ORM) | Resolution:

Severity: Normal | Triage Stage:
Keywords: queryset, only, | Unreviewed
related manager, manager | Needs documentation: 0
Has patch: 0 | Patch needs improvement: 0
Needs tests: 0 | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------
Changes (by sduveen):

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


Comment:

seeing if we can make a useful test

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

Django

unread,
Sep 6, 2013, 1:16:03 PM9/6/13
to django-...@googlegroups.com
#20927: Include known related fields for subclassed "QuerySet.only"
-------------------------------------+-------------------------------------
Reporter: lvo@… | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 1.5
(models, ORM) | Resolution:
Severity: Normal | Triage Stage:
Keywords: queryset, only, | Unreviewed
related manager, manager | Needs documentation: 0
Has patch: 0 | Patch needs improvement: 0
Needs tests: 0 | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------

Comment (by sduveen):

seems to be working in 1.6 and master.

This test shows we can do a query that has a manager and foreignkey
object.
https://github.com/schuyler1d/django/commit/047c131bc96a844d2769f3a4c5612119330413a1

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

Django

unread,
Sep 6, 2013, 1:16:36 PM9/6/13
to django-...@googlegroups.com
#20927: Include known related fields for subclassed "QuerySet.only"
-------------------------------------+-------------------------------------
Reporter: lvo@… | Owner: nobody
Type: Bug | Status: closed

Component: Database layer | Version: 1.5
(models, ORM) | Resolution: wontfix

Severity: Normal | Triage Stage:
Keywords: queryset, only, | Unreviewed
related manager, manager | Needs documentation: 0
Has patch: 0 | Patch needs improvement: 0
Needs tests: 0 | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------
Changes (by sduveen):

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


--
Ticket URL: <https://code.djangoproject.com/ticket/20927#comment:4>

Reply all
Reply to author
Forward
0 new messages