#19607: prefetch_related bug
-------------------------------------+-------------------------------------
     Reporter:  av@…                 |                    Owner:  nobody
         Type:  Bug                  |                   Status:  closed
    Component:  Database layer       |                  Version:  1.4
  (models, ORM)                      |               Resolution:  needsinfo
     Severity:  Normal               |             Triage Stage:
     Keywords:  prefetch             |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by smyrman):

 We have had several errors for this on http://dusken.no while using
 prefetch related. We have had several bug reports regarding this. The
 issues is hard to reproduce, but seems most likely to occur after objects
 have recently been changed in the database (for our case, after someone
 publishes another video).

 On one specific view (http://dusken.no/tv/siste/) We have about 17-18 hits
 for this error in a period of two months. The daily traffic would be
 between 100 and 500 visitors for this view, and there are currently no
 applied HTML caching.


 Here is the code we suspect. There are several:

 {{{
 feature_episodes =
 
Episode.objects.filter(is_published=True).order_by('-priority').select_related('season',
 'image').prefetch_related('category', 'season__series',
 'season__series__category')[:5]

 }}}

 And also:
 {{{
 if category == 'siste':
         episodes =
 Episode.objects.filter(is_published=True).order_by('-priority',
 '-public_from').select_related('season',
 'image').prefetch_related('category', 'season__series__category')
 {{{


 Her is the stack trace:


 {{{
 Traceback (most recent call last):

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/core/handlers/base.py", line 111, in get_response
     response = callback(request, *callback_args, **callback_kwargs)

   File "/srv/www/www.dusken.no/src/video/series/views.py", line 84, in
 list
     'feature_episodes': feature_episodes,

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/shortcuts/__init__.py", line 44, in render
     return HttpResponse(loader.render_to_string(*args, **kwargs),

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/loader.py", line 176, in render_to_string
     return t.render(context_instance)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/base.py", line 140, in render
     return self._render(context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/base.py", line 134, in _render
     return self.nodelist.render(context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/base.py", line 823, in render
     bit = self.render_node(node, context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/debug.py", line 74, in render_node
     return node.render(context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/loader_tags.py", line 123, in render
     return compiled_parent._render(context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/base.py", line 134, in _render
     return self.nodelist.render(context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/base.py", line 823, in render
     bit = self.render_node(node, context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/debug.py", line 74, in render_node
     return node.render(context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/loader_tags.py", line 62, in render
     result = block.nodelist.render(context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/base.py", line 823, in render
     bit = self.render_node(node, context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/debug.py", line 74, in render_node
     return node.render(context)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/template/defaulttags.py", line 145, in render
     len_values = len(values)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/db/models/query.py", line 89, in __len__
     self._prefetch_related_objects()

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/db/models/query.py", line 570, in
 _prefetch_related_objects
     prefetch_related_objects(self._result_cache,
 self._prefetch_related_lookups)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/db/models/query.py", line 1680, in
 prefetch_related_objects
     obj_list, additional_prl = prefetch_one_level(obj_list, prefetcher,
 attr)

   File "/srv/www/www.dusken.no/DUSKEN/lib/python2.6/site-
 packages/django/db/models/query.py", line 1808, in prefetch_one_level
     obj._prefetched_objects_cache[cache_name] = qs

 AttributeError: 'Series' object has no attribute
 '_prefetched_objects_cache'
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/19607#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 [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to