我正在使用Django休息框架,这是我的社交应用程序的serializers.py:
class SocialPostSerializer(serializers.ModelSerializer):
likes = serializers.SerializerMethodField() # define field
class Meta:
model = SocialPost
def get_likes(self, obj):
post_id = obj.id
#I get post_like from django-redis
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
通过上面的代码,我得到了我需要的API。
由于我的数据库中没有'likes'(这里是Mysql),我不能使用order_by('likes')来使用django ORM对数据进行排序
我按照这里的文档ListCreateAPIView引导我覆盖list():(之前我已经覆盖了create()和get_queryset())
from operator import itemgetter
class PostList(generics.ListCreateAPIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
queryset = Post.objects.all()
serializer_class = PostAllSerializer
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)
#problem here
serializer.data = sorted(serializer.data, key=itemgetter(serializer.data['likes']))
return Response(serializer.data)
def create(self, request, *args, **kwargs):
act_id = request.data.get('act')
act = Act.objects.get(pk=act_id)
if act.act_type == 0:
if request.user != act.user:
return Response(status=403)
return super().create(request, args, kwargs)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
def get_queryset(self):
queryset = Post.objects.all().order_by('-post_create_time')
act_id = self.request.query_params.get('act_id', None)
post_author = self.request.query_params.get('post_author', None)
if act_id is not None:
queryset = queryset.filter(act=act_id)
if post_author is not None:
queryset = queryset.filter(user__user_name=post_author)
return queryset
什么都没发生,即使我取消注释
,有线也是如此return Response(serializer.data)
仍然没有发生,哪一部分是错的?
另一个问题是,当我使用django FBV时,我想添加一些额外的数据,比如'问题':
def results(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/results.html', {'question': 'some data I wanna add'})
是否可以在serializer.data中添加数据?例如,我想显示user_id用户请求此api:
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)
user_id = request.user.id #how can I add the user_id into response data?
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
我在这里查看文档Including extra context。
serializer = AccountSerializer(account, context={'request': request})
我真的不明白如何在其中添加数据。
答案 0 :(得分:0)
“由于'喜欢'在我的数据库中不存在(这里是Mysql),我不能使用order_by('likes')用django ORM对数据进行排序”
您无法使用django ORM对结果进行排序,因为likes字段不是数据库表的一部分。唯一的方法是对视图中的serializer.data进行排序。在你的情况下,serializer.data将是一个字典列表,你可以使用sort命令列表并使用lambda对like进行排序。
这里需要注意的一件事是,您将通过在内存中加载数据来进行排序,确保您不会加载大量数据。检查内存利用率。
“另一个问题是,当我使用django FBV时,我想添加一些额外的数据,比如'问题'
我不明白这里需要什么。