Thanks for the answer, I just wondered if there was a built-in solution in
Django.

On 27/09/14 06:01, tkdchen wrote:
> 
> 
> On Saturday, September 27, 2014 9:06:58 PM UTC+8, aRkadeFR wrote:
> >
> > @James Brewer: 
> > If I change my code, I can have this user_ids list. 
> > btw, it's filter and not get if you're searching multiple objects (the 
> > user_ids). 
> >
> > @Alejandro Varas G.: 
> > That doesn't change the fact that 'User.objects.get(id=X)' will hit the 
> > database everytime. 
> >
> > Right now, the problem is solved, by creating the AllUserSet, but I think 
> > my 
> > code is pretty ugly, and it seems strange to me that the ORM can't handle 
> > that 
> > built-in, by caching the .all() or .filter(id__in=users_ids) 
> >
> >
> Django actually caches all objects fetched when it evaluates .all or 
> .filter method. The problem you are facing is that how to reuse the cached 
> objects efficiently to avoid hitting database with unnecessary SQL queries. 
> James gave you a good solution. Based on his solution, you don't need to 
> call the `get' method each time getting user by id. Just iterate users 
> object and find the right one by comparing id.
> 
> 
>  
> 
> > The ideally solution would be something like: 
> >
> >     AllUser = User.objects.all() 
> >
> >     for i in user_id: 
> >         AllUser.get(id=i) 
> >
> >
> This piece of code would be changed to
> 
> AllUser = User.objects.all()
> for i in user_id:
>     for user in AllUser:
>         if user.pk == i:
>             print 'find the user'
> 
> or, even you may construct AllUser to dict to simplify the search
> 
> AllUser = dict((user.pk, user) for user in User.objects.all()) # Here, hit 
> db, only once
> for i in user_id:
>     user = AllUser.get(i, None) # search by id in memory
>     if user is not None:
>         print 'find the user'
> 
> Hope, this could help you. 
> 
> But this code hits the database every time the 'get' is called. 
> >
> >
> > On 26/09/14 12:36, James Brewer wrote: 
> > > Do you have a single list of the IDs you want? If so, you can do 
> > something 
> > > like `User.objects.get(id__in=user_ids)`. This will fetch all Users 
> > whose 
> > > `id` is in some list `user_ids`. 
> > > 
> > > Does that help? 
> > > 
> > > Happy hacking! 
> > > 
> > > James 
> > > 
> > > On Fri, Sep 26, 2014 at 11:43 AM, Alejandro Varas G. <[email protected] 
> > <javascript:>> 
> > > wrote: 
> > > 
> > > > Hi, 
> > > > 
> > > > You should use User.objects.get(id=X) 
> > > > 
> > > > Best 
> > > > El 26/09/2014 15:28, "aRkadeFR" <[email protected] <javascript:>> 
> > escribió: 
> > > > 
> > > > > 
> > > > > Hey! 
> > > > > 
> > > > > I'm having a hard time trying to reduce the number of SQL queries on 
> > a 
> > > > view. 
> > > > > 
> > > > > Basically, I'm fetching all my User, with User.objects.all(), and 
> > save 
> > > > this 
> > > > > queryset as AllUser. 
> > > > > 
> > > > > Then every time I need to get the user with the id = X , I'm calling 
> > a 
> > > > function 
> > > > > 'get_user_from_id', that iterate over the AllUser queryset variable, 
> > and 
> > > > when 
> > > > > it finds the id, returns it. 
> > > > > 
> > > > > I considerably reduced the number of SQL queries, but I would like 
> > to 
> > > > know if 
> > > > > you think of a better way? 
> > > > > 
> > > > > Thank you 
> > > > > 
> > > > > -- 
> > > > > 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/20140926182939.GA26744%40rkade-thinkpad
> >  
> > > > . 
> > > > > 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] <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/CAL60nj%2BBtqs9CXu8drOiWPoJ7aUkAKjLqXKCxmR_TMTeOOH%3DGw%40mail.gmail.com
> >  
> > > > <
> > https://groups.google.com/d/msgid/django-users/CAL60nj%2BBtqs9CXu8drOiWPoJ7aUkAKjLqXKCxmR_TMTeOOH%3DGw%40mail.gmail.com?utm_medium=email&utm_source=footer>
> >  
> >
> > > > . 
> > > > 
> > > > For more options, visit https://groups.google.com/d/optout. 
> > > > 
> > > 
> > > 
> > > 
> > > -- 
> > > James Brewer 
> > > jamesbrewer.io 
> > > 
> > > -- 
> > > 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/CAKj8pVpqBgpFDQ0BruHXLWe2q1CRURMEejokhMKpD5bfs9hGGA%40mail.gmail.com.
> >  
> >
> > > 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/2d9a29de-9326-4ddc-a716-df9383b2aa32%40googlegroups.com.
> 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/20140928205119.GA22961%40rkade-thinkpad.
For more options, visit https://groups.google.com/d/optout.

Reply via email to