Tuesday, March 3, 2015

Re: Can the new `Prefetch` solve my problem?

Thanks a lot for your answer :)

I will definitely use it from now on.

On 03/03/2015 06:59 AM, Simon Charette wrote:
Hi cool-RR,

The following should do:

filtered_chairs = Chair.objects.filter(some_other_lookup=whatever)
desks = Desk.objects.prefetch_related(
    PrefetchRelated('chairs', filtered_chairs, to_attr='filered_chairs'),
    PrefetchRelated('nearby_chairs', filtered_chairs, to_attr='filtered_nearby_chairs'),
)

from itertools import chain
for desk in desks:
    for chair in chain(desk.filtered_chairs, desk.filtered_nearby_chairs):
        # ....

It will issue only three queries independently of the number of Chair or Desks you have.

Simon

Le mercredi 25 février 2015 15:05:50 UTC-5, cool-RR a écrit :
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+unsubscribe@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/726492e7-5f82-4690-a97c-20743592c3f8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment