Я пытаюсь объединить два сериализатора (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
Что мне здесь не хватает? Разве я не могу просто разбить на страницы свой метод списка, потому что я получаю вывод в формате, который я хочу