按非数据库字段

时间:2016-05-05 03:54:23

标签: django django-rest-framework

我正在使用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})

我真的不明白如何在其中添加数据。

1 个答案:

答案 0 :(得分:0)

“由于'喜欢'在我的数据库中不存在(这里是Mysql),我不能使用order_by('likes')用django ORM对数据进行排序”

您无法使用django ORM对结果进行排序,因为likes字段不是数据库表的一部分。唯一的方法是对视图中的serializer.data进行排序。在你的情况下,serializer.data将是一个字典列表,你可以使用sort命令列表并使用lambda对like进行排序。

这里需要注意的一件事是,您将通过在内存中加载数据来进行排序,确保您不会加载大量数据。检查内存利用率。

“另一个问题是,当我使用django FBV时,我想添加一些额外的数据,比如'问题'

我不明白这里需要什么。