web-dev-qa-db-ja.com

Django REST Frameworkで複数のモデルの結果を返す

記事、著者、ツイートの3つのモデルがあります。最終的にDjango=REST Frameworkを使用して、ArticleモデルとTweetモデルを使用してすべてのオブジェクトを1つの逆時系列フィードに集約するフィードを構築するフレームワークです。

私はそれをどのように行うのでしょうか?新しいシリアライザーを作成する必要があると感じていますが、実際にはわかりません。

ありがとう!

編集:これまでにやったことがあります。

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
38
aendrew

私にはかなり似ています。私は個人的に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の出力をリストに変換する必要があることに注意してください。