0

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)

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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', ...)

1 Comment

I am not sure how to do it exactly

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.