Reduce database queries when returning the User list resource.

Review Request #4825 — Created Oct. 21, 2013 and submitted

Information

Review Board
master

Reviewers

Reduce database queries when returning the User list resource.

The User API resource checked profile.is_private on each User being
serialized in a list, which is expensive. Unfortunately, neither
select_related() nor prefetch_related() appear to properly cache reverse
ForeignKey relations, so they don't help us with this.

The best solution, it seems, is to tack on an extra query for our users,
storing the result of Profile.is_private on the User. The
is_profile_visible function checks for this, and attempts to do the
right thing by making use of that value, if it's available.

Viewed the query count and list of queries before and after this change.
Before the change, there was an extra query per listed user. After,
there was a flat amount of 4 (which includes session and auth queries).

Description From Last Updated

I am really confused about the nature of 'self'. Is it a Profile or a User?

daviddavid
david
  1. 
      
  2. reviewboard/accounts/models.py (Diff revision 1)
     
     
     
     
    Show all issues

    I am really confused about the nature of 'self'. Is it a Profile or a User?

    1. It's the user. 'is_private' comes from the query mentioned in the comment.

    2. Can you add a comment saying that this methods is patched into the User object?

  3. 
      
chipx86
david
  1. Ship It!

  2. 
      
chipx86
Review request changed
Status:
Completed