我正在尝试在一个视图中合并两个序列化程序(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
我在这里想念什么?我不能简单地分页列出方法,因为我得到的格式是我想要的格式
您应该看一下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},
....
]