djangodjango-serializer

django - get serializer output into another serializer


I want to get the output of one serializer 'RoomSerializer' into 'JoinRoomSerializer's fields.

I have tried to get the 'RoomSerializer' as a variable into 'JoinRoomSerializer' and then pass it in 'fields', but im getting the following error: Got AttributeError when attempting to get a value for field room_extends on serializer JoinedRoomSerializer. The serializer field might be named incorrectly and not match any attribute or key on the UserRoom instance. Original exception text was: 'UserRoom' object has no attribute 'room_extends'.

The Room model has field name and JoinRoom model has foreign key to room

My serializers:

class RoomSerializer(serializers.ModelSerializer):
    """Serializer for displaying all fields of the Room"""

    class Meta():
        model = Room
        fields = ['name']


class JoinedRoomSerializer(serializers.ModelSerializer):
    """Serializer for displaying the following fields of the joined UserRoom table"""
    room_extends = RoomSerializer(many=True)

    class Meta():
        model = UserRoom
        fields = ['room_extends', 'date_joined']

Solution

  • You are using ModelSerializer so you in Meta class you have to specify fields that your model has. I am almost sure in your case foreign key field is not named room_extends and this cases the error

    class RoomSerializer(serializers.ModelSerializer):
        """Serializer for displaying all fields of the Room"""
    
        class Meta():
            model = Room
            fields = ['name']
    
    
    class JoinedRoomSerializer(serializers.ModelSerializer):
        """Serializer for displaying the following fields of the joined UserRoom table"""
        room = RoomSerializer(many=True) # name of variable same as in UserRoom model
    
        class Meta():
            model = UserRoom
            fields = ['room', 'date_joined']
    

    Or you can use source

    class RoomSerializer(serializers.ModelSerializer):
        """Serializer for displaying all fields of the Room"""
    
        class Meta():
            model = Room
            fields = ['name']
    
    
    class JoinedRoomSerializer(serializers.ModelSerializer):
        """Serializer for displaying the following fields of the joined UserRoom table"""
        room_extends = RoomSerializer(many=True, source='room') # room or whatever is foreignkey field name
    
        class Meta():
            model = UserRoom
            fields = ['room_extends', 'date_joined']