def inject_to(self, objects, field_name, get_inject_object = lambda obj: obj,
                  select_related = None, **kwargs):
        '''
        ``objects`` is an iterable. Related objects
            will be attached to elements of this iterable.

        ``field_name`` is the attached object attribute name

        ``get_injector_object`` is a callable that takes object in `objects`
            iterable. Related objects will be available as an attribute of the
            result of ``get_inject_object(obj)``. It is assumed that ``fk_field``
            points to  ``get_inject_object(obj)``.

        ``select_related`` is a list to be passed to select_related method for
            related objects.

        All other kwargs will be passed as arguments to queryset filter function.

        For example, we need to prefetch user profiles when we display a list of
        comments::

            # models.py
            class UserProfile(models.Model):
                user = models.ForeignKey(User, unique=True)
                info = models.CharField(max_length=100)
                objects = models.Manager()
                injector = RelatedInjector(fk_field='user')

            # views.py
            def show_comments(request, obj_id):
                ...
                comments = list(Comment.objects.for_model(obj).select_related('user'))
                UserProfile.injector.inject_to(comments, '_profile_cache',
                                               lambda comment: comment.user)

                return direct_to_template('comment_list.html', {'comments': comments})

            # in comment_list.html
            {% for comment in comments %}
                <h3>{{ comment.user }}</h3>
                <h4>{{ comment.user.get_profile.info }}</h4>
                {{ comment.comment|linebreaks }}
            {% endfor %}

        ``comment.user`` attribute will be selected using ``select_related`` and
        ``comment.user._profile_cache`` (exposed by get_profile method) will be
        selected by our injector. So there will be only 2 SQL queries for
        selecting all comments with users and user profiles.

        '''

        #get related data
        kwargs.update({self.fk_field+'__in': [ get_inject_object(obj).pk for obj in objects ]})

        data = self.get_query_set().filter(**kwargs)
        if select_related:
            data = data.select_related(select_related)

        data_dict = dict((getattr(item, self.fk_field), item) for item in list(data))

        # add info to original data
        for obj in objects:
            injected_obj = get_inject_object(obj)

            if data_dict.has_key(injected_obj):
                # fk_field was ForeignKey so there are objects in lookup dict
                get_inject_object(obj).__setattr__(field_name, data_dict[injected_obj])

            elif data_dict.has_key(injected_obj.pk):
                # fk_field was simple IntegerField so there are pk's in lookup dict
                get_inject_object(obj).__setattr__(field_name, data_dict[injected_obj.pk])
``objects`` is an iterable. Related objects
            will be attached to elements of this iterable.

        ``field_name`` is the attached object attribute name

        ``get_injector_object`` is a callable that takes object in `objects`
            iterable. Related objects will be available as an attribute of the
            result of ``get_inject_object(obj)``. It is assumed that ``fk_field``
            points to  ``get_inject_object(obj)``.

        ``select_related`` is a list to be passed to select_related method for
            related objects.

        All other kwargs will be passed as arguments to queryset filter function.

        For example, we need to prefetch user profiles when we display a list of
        comments::

            # models.py
            class UserProfile(models.Model):
                user = models.ForeignKey(User, unique=True)
                info = models.CharField(max_length=100)
                objects = models.Manager()
                injector = RelatedInjector(fk_field='user')

            # views.py
            def show_comments(request, obj_id):
                ...
                comments = list(Comment.objects.for_model(obj).select_related('user'))
                UserProfile.injector.inject_to(comments, '_profile_cache',
                                               lambda comment: comment.user)

                return direct_to_template('comment_list.html', {'comments': comments})

            # in comment_list.html
            {% for comment in comments %}
                <h3>{{ comment.user }}</h3>
                <h4>{{ comment.user.get_profile.info }}</h4>
                {{ comment.comment|linebreaks }}
            {% endfor %}

        ``comment.user`` attribute will be selected using ``select_related`` and
        ``comment.user._profile_cache`` (exposed by get_profile method) will be
        selected by our injector. So there will be only 2 SQL queries for
        selecting all comments with users and user profiles.