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.