got it, so you want to prefetch but not all chairs.

I will def follow this thread to see the possibilities of Prefetch :)

On 02/26/2015 12:52 PM, Ram Rachum wrote:
There may be a big number of chairs, and I don't want all the chairs prefetched. I want to have the database filter them according to the queryset I specified in a single call, I don't want to filter them in Python or make a new call to filter them.

Thanks,
Ram.

On Thu, Feb 26, 2015 at 1:48 PM, aRkadeFR <[email protected] <mailto:[email protected]>> wrote:

    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" <[email protected]> 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]> 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]> 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].
                    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/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].
                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/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]
    <mailto:[email protected]>.
    To post to this group, send email to
    [email protected] <mailto:[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
    
<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 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]
    <mailto:[email protected]>.
    To post to this group, send email to [email protected]
    <mailto:[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/54EF0808.9090009%40arkade.info
    
<https://groups.google.com/d/msgid/django-users/54EF0808.9090009%40arkade.info?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] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[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/CANXboVa6%2BtSa5gmEww2-gm3SGHvGgn2VjOBTbYQA%3DWTt6CaufA%40mail.gmail.com <https://groups.google.com/d/msgid/django-users/CANXboVa6%2BtSa5gmEww2-gm3SGHvGgn2VjOBTbYQA%3DWTt6CaufA%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/54EF0F3A.8000703%40arkade.info.
For more options, visit https://groups.google.com/d/optout.

Reply via email to