web-dev-qa-db-fra.com

Retourne les résultats de plusieurs modèles avec Django REST Framework

J'ai trois modèles - articles, auteurs et tweets. J'ai finalement besoin d'utiliser Django REST Framework pour construire un flux qui agrège tous les objets en utilisant les modèles Article et Tweet en un seul flux chronologique inversé).

Une idée de comment je ferais ça? J'ai l'impression d'avoir besoin de créer un nouveau sérialiseur, mais je ne suis vraiment pas sûr.

Merci!

Edit: Voici ce que j'ai fait jusqu'à présent.

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

Cela me semble assez proche. Je n'ai pas utilisé ViewSets dans DRF personnellement, mais je pense que si vous changez votre code en ceci, vous devriez aller quelque part (désolé - pas testé non plus):

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)

Si vous n'êtes pas connecté à l'utilisation d'un ViewSet, un generics.ListAPIView serait un peu plus simple:

class TimeLineList(generics.ListAPIView):
    serializer_class = TimeLineSerializer

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

Notez que vous devez convertir la sortie de chain en une liste pour que cela fonctionne.

23