Skip to content

Commit 754d107

Browse files
authored
Merge pull request #156 from PROCOLLAB-github/feature/caching-views-and-likes
Caching for likes & views
2 parents f5a9bf9 + 283df2a commit 754d107

2 files changed

Lines changed: 23 additions & 6 deletions

File tree

core/constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
ONE_DAY_IN_SECONDS = 60 * 60 * 24
22
ONE_WEEK_IN_SECONDS = ONE_DAY_IN_SECONDS * 7
3+
VIEWS_CACHING_TIMEOUT = 60 * 15
4+
LIKES_CACHING_TIMEOUT = 60 * 15

core/services.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from django.contrib.auth import get_user_model
22
from django.contrib.contenttypes.models import ContentType
3+
from django.core.cache import cache
34

5+
from core.constants import VIEWS_CACHING_TIMEOUT, LIKES_CACHING_TIMEOUT
46
from core.models import Like, View, Link
57

68
User = get_user_model()
@@ -34,9 +36,15 @@ def get_fans(obj):
3436

3537
def get_likes_count(obj):
3638
obj_type = ContentType.objects.get_for_model(obj)
37-
return User.objects.filter(
38-
likes__content_type=obj_type, likes__object_id=obj.id
39-
).count()
39+
# cache this
40+
likes_count = cache.get(f"likes_count_{obj_type}_{obj.id}")
41+
if likes_count is None:
42+
likes_count = User.objects.filter(
43+
likes__content_type=obj_type, likes__object_id=obj.id
44+
).count()
45+
# cache for LIKES_CACHING_TIMEOUT seconds
46+
cache.set(f"views_count_{obj_type}_{obj.id}", likes_count, LIKES_CACHING_TIMEOUT)
47+
return likes_count
4048

4149

4250
def set_like(obj, user, is_liked):
@@ -76,9 +84,16 @@ def get_viewers(obj):
7684

7785
def get_views_count(obj):
7886
obj_type = ContentType.objects.get_for_model(obj)
79-
return User.objects.filter(
80-
views__content_type=obj_type, views__object_id=obj.id
81-
).count()
87+
# cache this
88+
views_count = cache.get(f"views_count_{obj_type}_{obj.id}")
89+
if views_count is None:
90+
views_count = User.objects.filter(
91+
views__content_type=obj_type, views__object_id=obj.id
92+
).count()
93+
# cache for VIEWS_CACHING_TIMEOUT seconds
94+
cache.set(f"views_count_{obj_type}_{obj.id}", views_count, VIEWS_CACHING_TIMEOUT)
95+
96+
return views_count
8297

8398

8499
def set_viewed(obj, user, is_viewed):

0 commit comments

Comments
 (0)