使用Django REST Framework从多个模型返回结果

时间:2013-09-09 15:58:46

标签: python django django-models django-views django-rest-framework

我有三个模型 - 文章,作者和推文。我最终需要使用Django REST Framework来构建一个feed,它使用Article和Tweet模型将所有对象聚合成一个反向时间顺序的Feed。

知道我该怎么做吗?我觉得我需要创建一个新的序列化器,但我真的不确定。

谢谢!

编辑:这是我迄今为止所做的。

应用程序/ serializers.py:

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

应用程序/ 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

1 个答案:

答案 0 :(得分:22)

它看起来非常接近我。我个人没有在DRF中使用ViewSets,但我认为如果你将代码更改为此,你应该到达某个地方(对不起 - 没有测试其中任何一个):

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)

如果您不习惯使用ViewSet,那么generics.ListAPIView会更简单一些:

class TimeLineList(generics.ListAPIView):
    serializer_class = TimeLineSerializer

    def get_queryset(self):
        return list(itertools.chain(Tweet.objects.all(), Article.objects.all()))

请注意,您必须将chain的输出转换为列表才能生效。