如何组合Redis和Django rest框架中的值



我正在构建一个具有"赞"功能的社交应用程序,我正在使用django redis存储每个帖子的"赞"数字,如下所示:

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

从文档Raw客户端访问

它工作得很好,我还使用django-rest框架提供api,ListCreateAPIView列出所有帖子。通常,它会显示数据库中所需的任何字段。这里的问题是,现在我想在这个API中显示来自django-redis的"赞"计数,这意味着json返回来自我的数据库和django-recis。

我看过关于django rest框架的源代码

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框架从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

您可以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以及其他参数。

也许这不是你想要的答案,但我的建议是看看Cacheops

它为您的django模型提供了一个自动缓存/无效机制,因此您不必在代码中处理redi和db的不同查找,只需使用默认的django-orm,它将在后台为您处理内存缓存。如果你把点赞同时存储在db和redis中,在我看来这是一个更好的解决方案。

相关内容

  • 没有找到相关文章

最新更新