karank
karank

Reputation: 51

how to fetch data from two different models in single api call in django rest frame work? is it possibel if yes then how?

I am having trouble getting data of two models from a single view in Django rest framework. Here is what I have done so far, but I am not sure how can I get the data from two models using single view.

urlpatterns = [

    path('users/<int:id>/', GenericAPIView.as_view()),
    path('users/', GenericAPIView.as_view()),

]

# User Serializer
class userSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'


# usersdata serializer

class userdataSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserData
        fields = '__all__'

this is my views.py


class GenericAPIView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.RetrieveModelMixin,
                     mixins.UpdateModelMixin):
    serializer_class = userdataSerializer, userSerializer
    queryset = UserData.objects.all()

    lookup_field = 'id'



    def get(self, request, id=None):
        if id:
            return self.retrieve(request)
        else:
            return self.list(request)

    def post(self, request):

        return self.create(request)

    def put(self, request, id=None):
        return self.update(request, id)

Upvotes: 0

Views: 1286

Answers (2)

aasutossh
aasutossh

Reputation: 96

I am clearing https://stackoverflow.com/users/8661327/eternal 's answer (can't comment, not enough reputation). I guess you'd want to use Nested Relationships concept. From the docs:

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ['order', 'title', 'duration']

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ['album_name', 'artist', 'tracks']

If you see the output of an Album, it will show up like following:

{
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse',
    'tracks': [
        {'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
        {'order': 2, 'title': 'What More Can I Say', 'duration': 264},
        {'order': 3, 'title': 'Encore', 'duration': 159},
        ...
    ],
}

In your case, modify serializers.py to look like this:


# User Serializer
class userSerializer(serializers.ModelSerializer):
    user_data = userdataSerializer(many=True, read_only=True)
    class Meta:
        model = User
        fields = '__all__'
        fields += ["user_data"]


# usersdata serializer

class userdataSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserData
        fields = '__all__'

This way, your User contains data from UserData model too.

Upvotes: 2

Eternal
Eternal

Reputation: 933

You can modify one of the serializers to include another one.

class userSerializer(serializers.ModelSerializer):
    user_data = userdataSerializer()
    class Meta:
        model = User
        fields = ('field1', 'field2', 'user_data', ...)

Upvotes: 1

Related Questions