Как насчет конечной точки группового лайка?
content/batch_likes/?post_ids=1,2,3,4,5...
и возвращаемое значение либо понравившихся идентификаторов
[1,3,5]
, либо карты предпочтений:
{"1": true, "2": false, "3": true, "4": false, "5": true}
Они оба могут быть реализованы очень эффективно : Список:
liked_ids = Like.objects.filter(user=self.request.user, post_id__in=post_ids).values_list('post_id', flat=True)
Dict (используя вышеприведенное):
like_map = dict.fromkeys(post_id, False)
like_map.update({liked_id: True for liked_id in liked_ids})
РЕДАКТИРОВАТЬ:
Вы также можете выставить это в сериализаторе DRF:
class PostSerializer(serializers.ModelSerializer):
user_liked = serializers.SerializerMethodField()
# ... other fields and meta ...
def get_user_liked(self, obj) -> bool:
# See if we'd cached this...
if hasattr(obj, '_user_liked'):
return obj._user_liked
# Or if we didn't, do a query (boo-hoo, slow)
return self.obj.like_set.filter(user=self.context['request'].user).exists()
Затем вы можете добавить предварительную выборку в свой набор представлений DRF, чтобы получить это _user_liked
свойство «кэширования» для ваших объектов в одном запросе.
Другой механизм для работы с пользователем, такой как кэш может быть, чтобы поместить карту в этот контекст сериализатора.