我正在构建一个具有"赞"功能的社交应用程序,我正在使用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中,在我看来这是一个更好的解决方案。