如何在具有多个排序序列化程序的列表方法中进行分页django rest框架视图

问题描述 投票:0回答:1

我正在尝试在一个视图中合并两个序列化程序(Post和PostShare)以显示在我的Feed中。这是我的观点

class PostAPIView(
mixins.CreateModelMixin, 
generics.ListAPIView,
ObjectMultipleModelAPIView,
mixins.ListModelMixin,
ListView): 
    permission_classes          = [permissions.IsAuthenticatedOrReadOnly]
    serializer_class            = PostSerializer
    # filter_backends             = [filters.OrderingFilter,filters.SearchFilter, 
django_filters.rest_framework.DjangoFilterBackend]
    # filter_fields               = ['author']
    # search_fields               = ['content','author']
    # ordering_fields             = ['created_at']
    # ordering                    = ['-created_at']
    pagination_class            = LimitOffsetPagination

    # pagination_class = LimitPagination
    default_limit = 2
    # # paginate_by = 2
    # # page_size=2
    # #queryset = Post.objects.all()
    def list(self, request, format = None, **kwargs):

        posts = Post.objects.all()
        post_shares = PostShare.objects.all() 

        serializer_post = PostSerializer(posts,many=True).data
        serializer_post_share = PostShareReadSerializer(post_shares,many=True).data
        # rr=sorted(list(chain(posts,post_shares)), key=lambda x: x.created_at,reverse = 
         True)


        # print(rr)
        result_lst = sorted(serializer_post + serializer_post_share, key=lambda x: x.get('created_at'),reverse = True)
        print(result_lst)
        # page = self.paginate_queryset(result_lst,2)
        # paginator_request_var = "page"
        # page = request.GET.get(paginator_request_var)
        # posts = paginator.get_page(page)

        # return Response(result_lst_page,context)
        # print(result_lst)
        # return self.get_paginated_response(result_lst)
        return Response(result_lst)

这在get_queryset中不起作用,因此我将其放在列表方法中,但这没有显示分页。有什么办法我可以对结果进行分页吗?或任何其他方法将这些查询集和序列化程序与分页结合起来?

编辑1我尝试了ObjectMultipleModelAPIView并放入了querylist = [ {'queryset': Post.objects.all(), 'serializer_class': PostSerializer}, {'queryset': PostShare.objects.all(), 'serializer_class': PostShareReadSerializer}, .... ]在我的queryset方法中以及在它之外但出现错误

“尝试获取序列化器medias上字段PostSerializer的值时出现KeyError。\ n序列化器字段的名称可能不正确,并且与dict实例上的任何属性或键都不匹配。\ n原始异常文本为: “媒体”。”这是我的PostSerializer类PostSerializer(serializers.ModelSerializer):

class Meta:
    model = Post
    fields = [
        ....
        'medias',
        ....
    ]
   def create(self, validated_data):
    user = None
    request = self.context.get("request")
    if request and hasattr(request, "user"):
        user = request.user
    media_data = validated_data.pop('medias')

    post = Post.objects.create(author= user, **validated_data)
    for media in media_data:
        media = Media.objects.create(author= user, **media)
        post.medias.add(media)


    post.save()
    return post

我在这里想念什么?我不能简单地分页列出方法,因为我得到的格式是我想要的格式

django django-rest-framework itertools django-serializer
1个回答
0
投票

您应该看一下drf_multiple_model-https://github.com/MattBroach/DjangoRestMultipleModels

它以更干净的方式完成您想要的工作。

from drf_multiple_model.views import ObjectMultipleModelAPIView

class PostAPIView(ObjectMultipleModelAPIView):
    querylist = [
        {'queryset': Post.objects.all(), 'serializer_class': PostSerializer},
        {'queryset': PostShare.objects.all(), 'serializer_class': PostShareReadSerializer},
        ....
    ]
© www.soinside.com 2019 - 2024. All rights reserved.