如何将Redis和Django-rest-framework的值结合起来

4

我正在构建一个带有“点赞”功能的社交应用程序,我正在使用django-redis来存储每篇帖子的“点赞”数量,如下所示:

from django_redis import get_redis_connection
con = get_redis_connection("default")
con.incr("post" + ":" + id)

这段内容需要翻译的是关于it技术中的django-redis以及django-rest-framework的使用问题。其中,Raw client access文档提供了相关信息。

在我的项目中,我使用django-rest-framework提供api,ListCreateAPIView用来列举所有帖子。通常情况下,它会显示数据库中你想要的任何字段。但现在我的问题是,我想在API中显示来自django-redis的“喜欢”计数,也就是说返回的json数据既包括我的数据库,也包括django-redis。

我已经查看了有关django-rest-framework的源代码。

class ListCreateAPIView(mixins.ListModelMixin,mixins.CreateModelMixin,
                    GenericAPIView):
    """
    Concrete view for listing a queryset or creating a model instance.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

以及列表方法:

class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

看起来我只能从数据库查询集中获取数据(我使用的是Mysql)。有没有可能通过django-rest-framework从django-redis返回数据?

解决方案: 感谢@Rahul Gupta的回答,我进行了一点小调整以使其更好地运作:

def get_likes(self, obj):
    post_id = obj.id
    post_like = get_redis_connection("default")
    likes = post_like.get("post"+":"+str(post_id))
    if likes == None:
        return 0
    else:
        likes = likes.decode('utf-8')
        return likes
2个回答

2
也许这不是你想要的答案,但我的建议是看一下Cacheops
它为您的Django模型提供了自动缓存/失效机制,因此您不必在代码中处理Redis和DB的不同查找,只需使用默认的Django ORM,在后台它将为您处理内存缓存。如果您无论如何都要在db和redis中存储likes,我认为这是一个更好的解决方案。

谢谢,兄弟,我会看这个项目的。 - Windsooon

2
你可以在你的PostSerializer中添加一个'likes' SerializerMethodField,以将likes添加到对象的序列化表示中。
class SocialPostSerializer(serializers.ModelSerializer):

    likes = serializers.SerializerMethodField() # define field

    class Meta:
        model = SocialPost

    def get_likes(self, obj):
        social_post_id = obj.id    
        # here write the logic to get the no. of likes 
        # for a social post using the 'social_post_id' from redis    
        return likes 

现在,DRF在list请求返回的序列化数据中会包含一个参数likes,以及其他参数。

1
谢谢,它很好用。我已经编辑了我的帖子,以避免在这种特定情况下出现“TypeError:b'1'不是JSON可序列化”的问题。 - Windsooon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接