Wondermarin
Wondermarin

Reputation: 211

How do I combine multiple models into a single serializer?

it was necessary to combine several models(4) in one serializer, but there were problems with the implementation.

urls.py

from django.urls import path
from .views import FiltersView

urlpatterns = [
    path('filters/' FiltersView.as_view(), name='Filters')
]

views.py

from rest_framework import views
from rest_framework.response import Response
from rest_framework.status import HTTP_200_OK
from .serializers import FiltersSerializers

class FiltersView(views.APIView):
    def get(self, request, *args, **kwargs):
        filters = {}
        filters['model_1'] = Model1.objects.all()
        filters['model_2'] = Model2.objects.all()
        filters['model_3'] = Model3.objects.all()
        serializer = FiltersSerializers(filters, many=True)
        return Response (serializer.data, status=HTTP_200_OK)

serializers.py

from rest_framework import serializers

class FiltersSerializers(serializers.Serializer):
    model_1 = Model1Serializers(read_only=True, many=True)
    model_2 = Model2Serializers(read_only=True)
    model_3 = Model3Serializers(read_only=True)

But on the output I get:

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {},
    {},
    {}
]

What could be the problem?

Upvotes: 1

Views: 653

Answers (1)

Muhammad Hassan
Muhammad Hassan

Reputation: 14391

The way you are providing data to your serializer, many=True is not correct argument for it. Its a single object that you are passing to your serializer. Your view should be like this.

class FiltersView(views.APIView):
    def get(self, request, *args, **kwargs):
        filters = {}
        filters['model_1'] = Model1.objects.all()
        filters['model_2'] = Model2.objects.all()
        filters['model_3'] = Model3.objects.all()
        serializer = FiltersSerializers(filters)
        return Response (serializer.data, status=HTTP_200_OK)

Upvotes: 2

Related Questions