Priority: Normal
App ID: globalnewsapp - 18666
We are having intermittent server timeouts or status 503 on an endpoint. As reported in a previous thread in the tech-channel, sometimes a memory error occurs. The endpoint returns a filtered set of posts that is limited to 20 instances per query. The endpoint is already filtered for the user’s selected categories while excluding users that are blocked and muted. I have been testing the endpoint since Monday and worst response time is ~4 seconds.
Here is the queryset and serializer used for the endpoint.
Queryset:
class PostViewSet(ModelViewSet):
def get_queryset(self):
if self.action != "list":
return Post.objects.valid_posts()
user = self.request.user
categories = list(user.categories.values_list("id", flat=True))
blocked = list(user.blocked.values_list("id", flat=True))
muted = list(user.muted_users.values_list("id", flat=True))
excluded = list(set(blocked + muted))
return (
Post.objects.filter(
Q(author__in=user.following.filter(tier=User.TIER_GNA_VERIFIED))
| Q(author=user)
| Q(
author__tier__lte=User.TIER_3,
author__privacy_settings=User.PRIVACY_PUBLIC,
),
category__id__in=categories,
is_active=True,
is_chatter=False,
)
.prefetch_related("trending_topics", "ratings")
.exclude(author__id__in=excluded)
.annotate(
share_count=Count("shares"),
comment_count=Count("comments"),
citation_count=Count("citations"),
)
.distinct()
.order_by("-created_at")
)
Serializer:
class PostSerializer(serializers.ModelSerializer):
media = MediaSerialzier(many=True, required=False)
author = FeedUserSerializer(
required=False,
)
trending_topics = TrendingTopicSerializer(required=False, many=True)
share_count = serializers.ReadOnlyField()
comment_count = serializers.ReadOnlyField()
is_shared = serializers.ReadOnlyField()
trending_post = serializers.ReadOnlyField()
location = LocationSerializer()
citations_count = serializers.ReadOnlyField()
original_post = SharedPostSerializer()
user_rating = serializers.SerializerMethodField()
def get_user_rating(self, obj):
user = self.context.get("user")
if (obj.author == user) & obj.ratings.exists():
return (
obj.ratings.values("rating")
.annotate(the_count=Count("rating"))
.order_by("-the_count")
.first()["rating"]
)
rating = get_object_or_None(PostRating, post=obj, user=user)
if rating:
return rating.rating
class Meta:
model = Post
exclude = [
"citations",
]
cc @dilara