I may not have completely understand your problem, but
why not prefetching all the chairs? and then with the (new)
attribute favorite_or_nearby_chairs loading only the favorite
or nearby one?

like:
@property
def favorite_or_nearby_chairs(self):
    for chair in self.chair_set.all():
          #filter...
          ans += ...
    return ans

It will only hit the DB once thanks to the first join of desk
<-> chair.

On 02/26/2015 11:28 AM, cool-RR wrote:
James, you misunderstood me.

There isn't supposed to be a `favorite_or_nearby_chairs` attribute. That's the new attribute I want the prefetching to add to the `Desk` queryset that I need. Also, I don't understand why you'd tell me to add a `.select_related('nearby_desks')` to my query. Are you talking about the query that starts with `Chair.objects`? I'm not looking to get a `Chair` queryset. I'm looking to get a `Desk` queryset, which has a prefetched attribute `favorite_or_nearby_chairs` which contains the `Chair` queryset I wrote down.


Thanks,
Ram.

On Thursday, February 26, 2015 at 6:02:15 AM UTC+2, James Schneider wrote:

    Well, the Desk model you provided is blank, but I'll believe you
    that there's a favorite_or_nearby_chairs attribute. ;-)

    Should be relatively simple. Just add a
    .select_related('nearby_desks') to your existing query and that
    should pull in the associated Desk object in a single query. You
    can also substitute in prefetch_related(), although you'll still
    have two queries at that point.

    If you are trying to profile your site, I would recommend the
    Django-debug-toolbar. That should tell you whether or not that
    query set is the culprit.

    -James

    On Feb 25, 2015 1:28 PM, "Ram Rachum" <r...@rachum.com
    <javascript:>> wrote:

        Hi James,

        I've read the docs but I still couldn't figure it out. My
        queryset works great in production, I'm trying to optimize it
        because our pageloads are too slow. I know how to use
        querysets in Django pretty well, I just don't know how to use
        `Prefetch`.

        Can you give me the solution for the simplified example I
        gave? This might help me figure out what I'm not
        understanding. One thing that might be unclear with the
        example I gave, is that I meant I want to get a queryset for
        `Desk` where every desk has an attribute names
        `favorite_or_nearby_chairs` which contains the queryset of
        chairs that I desrcibed, prefetched.


        Thanks,
        Ram.

        On Wed, Feb 25, 2015 at 11:18 PM, James Schneider
        <jrschn...@gmail.com <javascript:>> wrote:

            I assume that you are talking about the select_related()
            and prefetch_related() queryset methods?

            
https://docs.djangoproject.com/en/1.7/ref/models/querysets/#select-related
            
<https://docs.djangoproject.com/en/1.7/ref/models/querysets/#select-related>
            
https://docs.djangoproject.com/en/1.7/ref/models/querysets/#prefetch-related
            
<https://docs.djangoproject.com/en/1.7/ref/models/querysets/#prefetch-related>

            Both of those sections have excellent examples, and detail
            what the differences are (primarily joins vs. separate
            queries, respectively).

            For better help, you'll need to go into more detail about
            the queries you are trying to make, what you've tried
            (with code examples if possible), and the results/errors
            you are seeing.

            In general, I would try to get an initial queryset working
            and gathering the correct results first before looking at
            optimizations such as select_related(). Any sort of
            pre-fetching will only confuse the situation if the base
            queryset is incorrect.

            -James

            On Wed, Feb 25, 2015 at 12:05 PM, cool-RR
            <ram.r...@gmail.com <javascript:>> wrote:

                Hi guys,

                I'm trying to solve a problem using the new `Prefetch`
                but I can't figure out how to use it.

                I have these models:

                    class Desk(django.db.models.Model):
                        pass
                    class Chair(django.db.models.Model):
                        desk = django.db.models.Foreignkey('Desk',
                related_name='chair',)
                        nearby_desks = django.db.models.ManyToManyField(
                            'Desk',
                            blank=True,
                        )

                I want to get a queryset for `Desk`, but it should
                also include a prefetched attribute
                `favorite_or_nearby_chairs`, whose value should be
                equal to:

                    Chair.objects.filter(
                (django.db.models.Q(nearby_desks=desk) |
                django.db.models.Q(desk=desk)),
                some_other_lookup=whatever,
                    )

                Is this possible with `Prefetch`? I couldn't figure
                out how to use the arguments.


                Thanks,
                Ram.
-- You received this message because you are subscribed
                to the Google Groups "Django users" group.
                To unsubscribe from this group and stop receiving
                emails from it, send an email to
                django-users...@googlegroups.com <javascript:>.
                To post to this group, send email to
                django...@googlegroups.com <javascript:>.
                Visit this group at
                http://groups.google.com/group/django-users
                <http://groups.google.com/group/django-users>.
                To view this discussion on the web visit
                
https://groups.google.com/d/msgid/django-users/46d9fdb7-c008-4496-acda-ac7cb30b4a89%40googlegroups.com
                
<https://groups.google.com/d/msgid/django-users/46d9fdb7-c008-4496-acda-ac7cb30b4a89%40googlegroups.com?utm_medium=email&utm_source=footer>.
                For more options, visit
                https://groups.google.com/d/optout
                <https://groups.google.com/d/optout>.


-- You received this message because you are subscribed to a
            topic in the Google Groups "Django users" group.
            To unsubscribe from this topic, visit
            
https://groups.google.com/d/topic/django-users/EuPduHjSNos/unsubscribe
            
<https://groups.google.com/d/topic/django-users/EuPduHjSNos/unsubscribe>.
            To unsubscribe from this group and all its topics, send an
            email to django-users...@googlegroups.com <javascript:>.
            To post to this group, send email to
            django...@googlegroups.com <javascript:>.
            Visit this group at
            http://groups.google.com/group/django-users
            <http://groups.google.com/group/django-users>.
            To view this discussion on the web visit
            
https://groups.google.com/d/msgid/django-users/CA%2Be%2BciVk7_6VBDoBE-qjLBwrBxiNeVdP6-fwwnOXV%3DvSA3HnCw%40mail.gmail.com
            
<https://groups.google.com/d/msgid/django-users/CA%2Be%2BciVk7_6VBDoBE-qjLBwrBxiNeVdP6-fwwnOXV%3DvSA3HnCw%40mail.gmail.com?utm_medium=email&utm_source=footer>.


            For more options, visit https://groups.google.com/d/optout
            <https://groups.google.com/d/optout>.


--
You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com <mailto:django-users+unsubscr...@googlegroups.com>. To post to this group, send email to django-users@googlegroups.com <mailto:django-users@googlegroups.com>.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/fc6b1237-7bd0-44a7-a91e-c12301fe0e05%40googlegroups.com <https://groups.google.com/d/msgid/django-users/fc6b1237-7bd0-44a7-a91e-c12301fe0e05%40googlegroups.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Django 
users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/54EF0808.9090009%40arkade.info.
For more options, visit https://groups.google.com/d/optout.

Reply via email to