如何结合来自 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 中,我认为这是一个更好的解决方案。
我正在构建一个具有 "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 中,我认为这是一个更好的解决方案。