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

how to combine values from Redis and Django-rest-framework

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

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

来自文档 Raw client access

效果很好,我还使用django-rest-framework提供api,ListCreateAPIView列出所有posts.Usually它会显示数据库中你想要的任何字段。现在的问题是我想在此 API 中显示来自 django-redis 的 "like" 计数,这意味着 json return 来自我的数据库和 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 获取 return 数据的任何可能方法?

已解决: 感谢@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 模型提供了一种自动 caching/invalidation 机制,因此您不必在代码中处理对 redis 和 db 的不同查找,只需使用默认的 django orm,它会在后台处理内存缓存给你。如果你无论如何都将喜欢的东西存储在 db 和 redis 中,我认为这是一个更好的解决方案。