Как сделать разбиение на страницы в методе списка с несколькими отсортированными сериализаторами django остальные представления структуры - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь объединить два сериализатора (Post и PostShare) в одном представлении для отображения в моих каналах. Вот мой вид

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}, .... ] в моем методе набора запросов и вне его, но получил ошибку

"Возникла ошибка KeyError при попытке получить значение для поля medias в сериализаторе PostSerializer. \ 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

Что мне здесь не хватает? Разве я не могу просто разбить на страницы свой метод списка, потому что я получаю вывод в формате, который я хочу

1 Ответ

0 голосов
/ 14 января 2020

Вы должны взглянуть на 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},
        ....
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...