#26600: map says a queryset is not iterable
----------------------------------------------+----------------------------
     Reporter:  ihucos                        |      Owner:  nobody
         Type:  Bug                           |     Status:  new
    Component:  Database layer (models, ORM)  |    Version:  1.8
     Severity:  Normal                        |   Keywords:  queryset
                                              |  iterator map
 Triage Stage:  Unreviewed                    |  Has patch:  0
Easy pickings:  0                             |      UI/UX:  0
----------------------------------------------+----------------------------
 So I got a funny bug with iterators map and Django that I can not localize
 or reproduce.
 In our production server we get this sometimes, mainly for only one
 customer and it only fails on a very small percentage of all requests.

 Sorry for only chunks of information, not sure if it is enough to process
 this bug request:

 Th error message:
 {{{
 TypeError: argument 2 to map() must support iteration
 }}}

 Chunk of the code where this happens:
 {{{#!python
             if filter(
                     lambda obj:
                     self.pk in verbose_map(attrgetter('pk'),
                                            obj.resources.all()) and
                     obj.begins < end and obj.ends > dt,
 resource_override_qs):
                 return 0
 }}}

 Trying to reconstruct resource_override_qs I come up with:
 {{{#!python
 facility = Facility.objects.\
                 prefetch_related('resources',
                                  'opening_hours',
                                  'openinghour_overrides',
                                  'slow_hours').\
                 get(pk=facility.pk)
  resource_override_qs =
 facility.facilityresourceoverride_set.prefetch_related('resources')
 }}}

 What I did was to replace map with verbose_map in our production
 environment.
 {{{#!python
 def verbose_map(function, iterable):
     try:
         return map(function, iterable)
     except TypeError, exc:
         raise TypeError('map failed: "{}". iterable: {}, type: {}, attrs:
 {}'.format(  # NOQA
             exc, iterable, type(iterable), dir(iterable)))
 }}}

 After two weeks or so the error occurred again:
 {{{#!python
 map failed: "argument 2 to map() must support iteration". iterable:
 [<FacilityResource: 4>, <FacilityResource: 5>, <FacilityResource: 6>,
 <FacilityResource: 7>], type: <class 'django.db.models.query.QuerySet'>,
 attrs: ['__and__', '__bool__', '__class__', '__deepcopy__', '__delattr__',
 '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__',
 '__getstate__', '__hash__', '__init__', '__iter__', '__len__',
 '__module__', '__new__', '__nonzero__', '__or__', '__reduce__',
 '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', '_add_hints', '_as_sql',
 '_batched_insert', '_clone', '_create_object_from_params', '_db',
 '_earliest_or_latest', '_extract_model_params', '_fetch_all',
 '_filter_or_exclude', '_for_write', '_has_filters', '_hints', '_insert',
 '_known_related_objects', '_merge_known_related_objects',
 '_merge_sanity_check', '_next_is_sticky', '_populate_pk_values',
 '_prefetch_done', '_prefetch_related_lookups',
 '_prefetch_related_objects', '_prepare', '_raw_delete', '_result_cache',
 '_setup_aggregate_query', '_sticky_filter', '_update', 'aggregate', 'all',
 'annotate', 'as_manager', 'bulk_create', 'complex_filter', 'count',
 'create', 'dates', 'datetimes', 'db', 'defer', 'delete', 'distinct',
 'earliest', 'exclude', 'exists', 'extra', 'filter', 'first', 'get',
 'get_or_create', 'in_bulk', 'is_compatible_query_object_type', 'iterator',
 'last', 'latest', 'model', 'none', 'only', 'order_by', 'ordered',
 'prefetch_related', 'query', 'raw', 'reverse', 'select_for_update',
 'select_related', 'update', 'update_or_create', 'using',
 'value_annotation', 'values', 'values_list']
 }}}
 As we can see map really gets an QuerySet object, that queryset object
 does reveal its content in __str__ but python's built in map says its not
 iterable nevertheless
 Alone for the customer where this happens the most that part of the code
 should be called at least a couple of times per day.

 I am going with a workaround like calling list() on the queryset before
 mapping it or so.
 But my company should be ok, to try this again with another verbose_map
 that may provide more debugging information. My efforts to reproduce this
 in our code base failed.

--
Ticket URL: <https://code.djangoproject.com/ticket/26600>
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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/049.1b80a1fbb6e9e836f2344825fe47fc10%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to