Django Rest Framework value id is being sent, but is being received as null

Viewed 23

Having an issue where I am trying to set the interest_category. Here is my current code.

Serializer

class ProjectsSerializer(serializers.ModelSerializer):

    interest_category = serializers.StringRelatedField()

    class Meta:
        model = Project
        read_only_fields = (
            'created_by',
            'created_at',
            'updated_at',
        ),
        fields = (
            'project_title',
            'project_description',
            'interest_category',
        )

Model

class Project(models.Model):
    project_title = models.CharField(max_length=255)
    project_description = models.TextField(max_length=1500)
    interest_category = models.ForeignKey(Interests, on_delete=models.CASCADE)
    created_by = models.ForeignKey(User, related_name='projects', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

Views

class ProjectViewSet(viewsets.ModelViewSet):
    serializer_class = ProjectsSerializer
    queryset = Project.objects.order_by('-created_at')
    
    def perform_create(self, serializer):
        serializer.save(created_by=self.request.user)

Here is the data being sent

{
    "project_title": "Test",
    "project_description": "Test1",
    "interest_category": 2
}

Here is the data being received

(35, Test, Test1, 2022-09-22 02:11:54.342202+00, 2022-09-22 02:11:54.342202+00, 1, null).

I can send the data without a null error when I am NOT using the interest_category = serializers.StringRelatedField() in the serializer.

Any ideas why the interest_category is showing null and why it is not being sent and/or received correctly when using the serializers.StringRelatedField()?

And if it is because of the StringRelatedField is there a better way to get the name while posting the ID? In frontend, I am passing the ID as a value.

1 Answers

Instead of using interest_category = serializers.StringRelatedField() put interest_category = serializers.IntegerField(write_only=True) because StringRelatedField may be used to represent the target of the relationship using its __str__ method. Where IntegerField representation An integer.

because you sending integer value in data :

{
    "project_title": "Test",
    "project_description": "Test1",
    "interest_category": 2
}
Related