【问题标题】:How to keep track of which posts have been liked by a user?如何跟踪用户喜欢的帖子?
【发布时间】:2020-04-29 21:20:21
【问题描述】:

我正在开发一个允许用户喜欢内容的应用程序,如果用户喜欢该帖子,将通过将轮廓的心形图标更改为完全填充的心形图标来可视化该内容。

我有一个列表页面,它将数据库中的每个帖子都呈现为Content Card 组件。该组件包含上面提到的图标。为了决定组件是否应该用轮廓或填充的心来呈现,我需要一种方法来确定用户是否喜欢相应的帖子。

我目前在做什么

每个赞都是它自己的Like 模型实例,它有一个指向与之关联的帖子的外键。我在content/likes/?post_id=${postID} 有一个 API 端点,它为我提供了所有喜欢给定帖子的用户。

对于页面上的每个帖子,我都会调用此端点,然后循环响应以查看登录用户是否在喜欢该内容的用户列表中。如果是这样,我将一个状态设置为 true,然后为该帖子填满内心。

我的方法效果很好但是我对页面上的每个帖子都提出了单独的请求。假设我有 100 个帖子正在显示,我认为仅仅为了填充该图标而发出 100 个请求并不是最佳做法。

我一直在考虑如何改进这一点,但我不确定人们通常如何处理这个问题。任何帮助表示赞赏!

【问题讨论】:

    标签: reactjs django-rest-framework


    【解决方案1】:

    批量点赞端点怎么样?

    content/batch_likes/?post_ids=1,2,3,4,5...
    

    以及任一喜欢的 ID 的返回值

    [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)
    

    字典(使用上面的):

    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 视图集中添加一个 Prefetch,以便在单个查询中为您的对象获取 _user_liked“缓存”属性。

    另一种实现用户缓存的机制可能是在该序列化程序上下文中存储地图。

    【讨论】:

    • 谢谢,我会试一试。但是,我想知道是否可以将有关用户是否喜欢该帖子的信息与其他帖子内容一起发送?
    • @PhilippK 当然是。也添加了。
    • 谢谢,这看起来很有希望!不确定我将如何进行预取 - 快速搜索告诉我我会做类似queryset.prefetch_related('_user_liked') 的事情,还是我走错了方向?
    • 想想看,你应该可以用annotate(_user_liked=Count("like_set", filter=Q(user=self.request.user))或者类似的...
    • 感谢您的帮助,但不幸的是我一直遇到错误
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 2021-11-19
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2020-11-04
    • 2019-08-13
    • 2020-09-20
    相关资源
    最近更新 更多