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)