Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return results from multiple models with Django REST Framework

I have three models — articles, authors and tweets. I'm ultimately needing to use Django REST Framework to construct a feed that aggregates all the objects using the Article and Tweet models into one reverse chronological feed.

Any idea how I'd do that? I get the feeling I need to create a new serializer, but I'm really not sure.

Thanks!

Edit: Here's what I've done thus far.

app/serializers.py:

class TimelineSerializer(serializers.Serializer):     pk = serializers.Field()     title = serializers.CharField()     author = serializers.RelatedField()     pub_date = serializers.DateTimeField() 

app/views.py:

class TimelineViewSet(viewsets.ModelViewSet):     """     API endpoint that lists all tweet/article objects in rev-chrono.     """     queryset = itertools.chain(Tweet.objects.all(), Article.objects.all())     serializer_class = TimelineSerializer 
like image 336
aendra Avatar asked Sep 09 '13 15:09

aendra


1 Answers

It looks pretty close to me. I haven't used ViewSets in DRF personally, but I think if you change your code to this you should get somewhere (sorry - not tested either of these):

class TimelineViewSet(viewsets.ModelViewSet):     """     API endpoint that lists all tweet/article objects in rev-chrono.     """     def list(self, request):         queryset = list(itertools.chain(Tweet.objects.all(), Article.objects.all()))         serializer = TimelineSerializer(queryset, many=True)         return Response(serializer.data) 

If you're not wedded to using a ViewSet then a generics.ListAPIView would be a little simpler:

class TimeLineList(generics.ListAPIView):     serializer_class = TimeLineSerializer      def get_queryset(self):         return list(itertools.chain(Tweet.objects.all(), Article.objects.all())) 

Note you have to convert the output of chain to a list for this to work.

like image 126
David Jones - iPushPull Avatar answered Sep 24 '22 15:09

David Jones - iPushPull