Invalid data. Expected a dictionary, but got str

Expected Behavior

To create a new object using the ID of the ForeignKey Field.

Actual Behavior

It worked fine when the Serializer class looked like this :

class RequestSerializer(serializers.ModelSerializer):
    """
    Serializer for Request model
    """
    class Meta:
        """
        Meta class for RequestSerializer
        """
        model = Request
        fields = [
            "id",
            "category",
            "type",
            "finishing_type",
            "finishing_level",
            "need_design",
            "number_of_floors",
            "property_space",
            "no_of_receptions",
            "no_of_rooms",
            "no_of_bathrooms",
            "need_plumbing",
            "need_electricity",
            "need_paving",
            "need_painting",
            "need_carpentry",
            "need_plastering_cementing",
            "need_decorating",
            "include_materials",
            "need_installments",
            "max_installments",
            "min_installments",
            "brief_about_the_request",
            "expires_after_days",
            "location",
        ]

But then I've added a nested Serializer to be able to see more details when I do a GET request, so now its is like :

class RequestSerializer(serializers.ModelSerializer):
    """
    Serializer for Request model
    """
    location = CitySerializer(read_only=False)

    class Meta:
        """
        Meta class for RequestSerializer
        """
        model = Request
...

This Line location = CitySerializer(read_only=False) Helped me to see more details in Get request but enable to post request.

NOTE I have used it like location = CitySerializer(read_only=True) but also it returned this error :

NOT NULL constraint failed: requests_request.location_id

UPDATE

Here is the CitySerializer data :

class GovernorateSerializer(serializers.ModelSerializer):
    """
    Governorate Serializer
    """

    class Meta:
        """
        Metaclass for GovernorateSerializer
        """
        model = City
        fields = ('name',)


class CitySerializer(serializers.ModelSerializer):
    """
    Serializer for City model
    """
    governorate = GovernorateSerializer(read_only=True)

    class Meta:
        """
        Metaclass for CitySerializer
        """
        model = City
        fields = ['name', 'governorate']

And the ViewSet user for this process:

class RequestViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows requests to be viewed or edited.
    """
    queryset = Request.objects.all()
    permission_classes = (IsAuthenticated,)
    serializer_class = RequestSerializer

    def get_queryset(self):
        """
        Controls what is visible to the user
        """
        return self.queryset.all()

    def perform_create(self, serializer):
        """
        Sets the user to the request
        """
        serializer.save(user=self.request.user)
Back to Top