Reputation: 51
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
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
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