Разбивка на несколько запросов из разных моделей - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь получить данные от нескольких моделей от нескольких сериализаторов.и я получил ответ и данные, но то, что происходит, не давало мне ключей «count», «next» и «previous», чтобы использовать их для нумерации страниц.

, и я создал представление следующим образом:

views.py

class PlayerNotificationView(generics.GenericAPIView):
    def get_queryset(self):
        return

    def get(self, request, *args, **kwargs):
        activity_invitation_to_join = ActivityInvite.objects.filter(to_user=self.request.user,
                                                                active=True, status__in=('P', 'k',))
    team_invitation_to_join = TeamInvite.objects.filter(to_user=self.request.user, active=True,
                                                        status__in=('P', 'k',))
    team_player_left_team = TeamInvite.objects.filter(team__admin=self.request.user, active=True, status="L")
    activity_unread = ActivityInvite.objects.filter(to_user=self.request.user, read="False").count()
    team_unread = TeamInvite.objects.filter(to_user=self.request.user, read="False").count()
    total = activity_unread + team_unread
    un_read = [{'activity_unread': activity_unread,
                'team_unread': team_unread,
                'total': total}]

    context = [{

        "request": request,
    }]

    activity_serializer = MyActivityInviteSerializer(activity_invitation_to_join, many=True, context=context)
    team_serializer = MyTeamInviteSerializer(team_invitation_to_join, many=True, context=context)
    team_player_left_serializer = MyTeamInviteSerializer(team_player_left_team, many=True, context=context)

    un_sorted_queryset = activity_serializer.data + team_serializer.data + team_player_left_serializer.data

    from operator import itemgetter
    response = sorted(un_sorted_queryset, key=itemgetter('updated_date'), reverse=True) + un_read

    context = {
        "notifications": response,
    }
    return Response(context)

и он возвращает ответ, подобный этому:

{
    "notifications": [
        {
.
. 
.
}]}

, и мне нужно точно разбить результат, чтобы он был таким:

{
    "count": 2,

"next": next,

"previous": previous,

"notifications": [
    {.. }]}

}

Итак, как я могу это сделать?Пожалуйста, кто-нибудь может мне помочь?

, и если есть какое-то решение для этой точки зрения по-другому, чтобы получить данные от нескольких моделей и нескольких сериализаторов.

надеюсь, что это читабельно и понятно для понимания.большое спасибо,

обновление Решение это обновление и решение, чтобы помочь любому человеку, столкнувшемуся с той же проблемой, и он не получил ответ, я сделал это как то, что "schillingt"сказал в ответах следующее:

class LimitPagination(MultipleModelLimitOffsetPagination):
    default_limit = 1

class PlayerNotificationView(FlatMultipleModelAPIView):
pagination_class = LimitPagination
add_model_type = True
sorting_fields = ['updated_date']

def get_querylist(self):

    activity_invitation_to_join = ActivityInvite.objects.filter(to_user=self.request.user,
                                                                active=True, status__in=('P', 'k',))
    team_invitation_to_join = TeamInvite.objects.filter(to_user=self.request.user, active=True,
                                                        status__in=('P', 'k',))
    team_player_left_team = TeamInvite.objects.filter(team__admin=self.request.user, active=True, status="L")

    # un_sorted_queryset = activity_serializer.data + team_serializer.data + team_player_left_serializer.data

    querylist = (
        {'queryset': activity_invitation_to_join.distinct(), 'serializer_class': MyActivityInviteSerializer},
        {'queryset': team_invitation_to_join.distinct(), 'serializer_class': MyTeamInviteSerializer},
        {'queryset': team_player_left_team.distinct(), 'serializer_class': MyTeamInviteSerializer},
    )

    return querylist

1 Ответ

0 голосов
/ 03 февраля 2019

Вам нужно создать экземпляр класса Pagination и использовать его для генерации контента.Тем не менее, я бы порекомендовал использовать django-rest-multiple-models, так как это немного чище, чем то, что вы должны были бы сделать.Вам нужно будет переопределить метод, который фильтрует набор запросов, чтобы ограничить его текущим пользователем, но это должно быть относительно просто.

Если вы решите сделать это самостоятельно, здесь будет Документация DRF по нумерации страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...