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" <[email protected] <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 <[email protected]
>> <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/#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 <[email protected]
>>> <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 [email protected] <javascript:>.
>>>> To post to this group, send email to [email protected]
>>>> <javascript:>.
>>>> 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/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.
>>>>
>>>
>>> --
>>> 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.
>>> To unsubscribe from this group and all its topics, send an email to
>>> [email protected] <javascript:>.
>>> To post to this group, send email to [email protected]
>>> <javascript:>.
>>> 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/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.
>>>
>>
>>
--
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 [email protected].
To post to this group, send email to [email protected].
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.
For more options, visit https://groups.google.com/d/optout.