'How to use multiple models inside one viewset/serializer?

I have 2 items inside my system that I have to use.But I am trying to develop a system which i have to get them inside one view and order them by "timestamp".

class CalendarEventSerializer(serializers.ModelSerializer):

    class Meta:
        model = CalendarEvent
        fields = ("id","author",...)

class CalendarItemSerializer(serializers.ModelSerializer):

    class Meta:
        model = CalendarItem
        fields = ("id","author",...)

I use ViewSet to regulate my models to paginate and filter them.

class CalendarItemViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = CalendarItem.objects.all().order_by('-timestamp')
    serializer_class = CalendarItemSerializer
    filter_backends = [UserFilterBackend,DjangoFilterBackend]
    pagination_class = StandardResultsSetPagination
    filterset_fields = ['author']

class CalendarEventViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = CalendarEvent.objects.all().order_by('-timestamp')
    serializer_class = CalendarEventSerializer
    filter_backends = [UserFilterBackend,DjangoFilterBackend]
    pagination_class = StandardResultsSetPagination
    filterset_fields = ['author']

How can I use this system to merge 2 or models into one viewset or serializer like this?

Note:I know there are some answers for similar kind of questions in stackoverflow but my code structure is but different, I want to get some viewpoints

Update

So here is what i want to do: -I am forming a feed page like facebook/instagram and combine multiple models inside one view.

-I can already do it with the viewsets above,but i want to now merge them.

-I want to sort each item by its timestamp and retrieve them inside JSON but inside one system, not like :

calendarevents:[] calendaritems []

but like:

calendarevent 1(created 2 mins ago)
calendaritem 1 (created 3 mins ago)
calendarevent 2(created 4 mins ago) 
calendaritem 2(created 5 mins ago)

I am happy to include more information,just ask.

Update 2:

class CalendarEvent(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User,  on_delete=models.CASCADE,related_name='calendarevents')
    charfield1 = models.CharField(max_length=300)
    integerfield1 = models.IntegerField(default='0')
    charfield2 = models.CharField(max_length=200,null=True, blank=True)
    charfield3= models.CharField(null=True,blank=True,max_length=64000)

class CalendarItem(models.Model):


    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User,  on_delete=models.CASCADE,related_name='calendaritems')
    charfield1 = models.CharField(max_length=300)
    integerfield1 = models.IntegerField(default='0')
    charfield2 = models.CharField(max_length=200,null=True, blank=True)
    charfield3= models.CharField(null=True,blank=True,max_length=64000)




Solution 1:[1]

You can customize the login using APIView and Generic APIVIEW

Here is one of the ways you can achieve what you are trying to achieve.

class GetCalenderEventAndItemsAPIView(APIView, GenericAPIView):
    permission_classes = (IsAuthenticated,)
    item_queryset = CalendarItem.objects.all().order_by('-timestamp')
    event_queryset = CalendarEvent.objects.all().order_by('-timestamp')
    item_serializer_class = CalendarItemSerializer
    event_serializer_class = CalendarEventSerializer
    filterset_fields = ['author']

    def get_paginated_query(self, _query_set):
        page = self.paginate_queryset(self.filter_queryset(_query_set))
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        return page

    def get(self, request, *args, **kwargs):
        event_serializer = self.event_serializer_class(self.get_paginated_query(self.event_queryset),
                                                       many=True)
        item_serializer = self.event_serializer_class(self.get_paginated_query(self.item_queryset), many=True)

        response_results = {
            "calendarevents": event_serializer.data,
            "calendaritems": item_serializer.data

        }
        return Response(response_results)

It will get you in the right direction. Just play around above way of doing it.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Umar Hayat