Make less DB queries (particularly in the Forum)

This commit is contained in:
Skia 2017-05-14 04:36:04 +02:00
parent 862a4619b3
commit 23fe797a9e
2 changed files with 17 additions and 3 deletions

View File

@ -29,6 +29,7 @@ from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.forms import ValidationError from django.forms import ValidationError
from django.contrib.sites.shortcuts import get_current_site from django.contrib.sites.shortcuts import get_current_site
from django.utils.functional import cached_property
from datetime import timedelta, date from datetime import timedelta, date
import random import random
@ -215,6 +216,10 @@ class Counter(models.Model):
p.end = p.activity p.end = p.activity
p.save() p.save()
@cached_property
def barmen_list(self):
return self.get_barmen_list()
def get_barmen_list(self): def get_barmen_list(self):
""" """
Returns the barman list as list of User Returns the barman list as list of User
@ -246,7 +251,7 @@ class Counter(models.Model):
p.save() # Update activity p.save() # Update activity
def is_open(self): def is_open(self):
return len(self.get_barmen_list()) > 0 return len(self.barmen_list) > 0
def is_inactive(self): def is_inactive(self):
""" """

View File

@ -136,10 +136,19 @@ class Forum(models.Model):
def last_message(self): def last_message(self):
return self.get_last_message() return self.get_last_message()
forum_list = {} # Class variable used for cache purpose
def get_last_message(self): def get_last_message(self):
last_msg = None last_msg = None
for m in ForumMessage.objects.select_related('topic__forum', 'author').order_by('-id'): for m in ForumMessage.objects.select_related('topic__forum').order_by('-id'):
forum = m.topic.forum if m.topic.forum.id in Forum.forum_list.keys(): # The object is already in Python's memory,
# so there's no need to query it again
forum = Forum.forum_list[m.topic.forum.id]
else: # Query the forum object and store it in the class variable for further use.
# Keeping the same object allows the @cached_property to work properly.
# This trick divided by 4 the number of DB queries in the main forum page, and about the same on many other forum pages.
# This also divided by 4 the amount of CPU usage for thoses pages, according to Django Debug Toolbar.
forum = m.topic.forum
Forum.forum_list[forum.id] = forum
if self in (forum.parent_list + [forum]) and not m.deleted: if self in (forum.parent_list + [forum]) and not m.deleted:
return m return m