'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 |
