Want to retrieve a Foreign Key value instead of the whole object with django-rest-framework serializers

25 views Asked by At

I'm using the Django rest framework to create an API. I have the following models: Post method for /course/ endpoint models.py

class Faculty(models.Model):
    name = models.CharField(max_length=25, unique=False, null=False, blank=False)
    email = models.EmailField(max_length=25, unique=True, null=False, blank=False)


class Course(models.Model):
    name = models.CharField(max_length=25, unique=True, null=False, blank=False)
    faculty_name = models.ForeignKey(Faculty, on_delete=models.CASCADE, related_name='faculty_name')
    end_date = models.DateField()

    def __str__(self):
        return self.faculty_name

    # @property
    # def faculty_name(self):
    #     return self.faculty.name


To create a serializer serializers.py

class FacultySerializer(serializers.ModelSerializer):
    class Meta:
        model = Faculty
        fields = '__all__'


class CourseSerializer(serializers.ModelSerializer):
    # faculty_name = serializers.SlugRelatedField(slug_field='name', read_only=True)

    # faculty_name = serializers.ReadOnlyField(source='faculty.name')
    
    print(Faculty.objects.all().values('name'))

    class Meta:
        model = Course

        fields = ('name', 'faculty_name', 'end_date')

To create rest services using the following views:

views.py

class Course(mixins.ListModelMixin,
             mixins.CreateModelMixin,
             generics.GenericAPIView):
    serializer_class = CourseSerializer
    queryset = Course.objects.all()

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class Faculty(mixins.ListModelMixin,
              mixins.CreateModelMixin,
              generics.GenericAPIView):
    serializer_class = FacultySerializer
    queryset = Faculty.objects.all()

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

Getting the Faculty object while accessing the /course/ endpoint as shown in the image. want to get the faculty name instead of the Faculty object in the post method's form fields(dropdown)

I have tried the below codes:

1)faculty_name = FacultySerializer() --> not providing the faculty list
2)faculty_name = serializers.ReadOnlyField(source='faculty.name') --> hiding the faculty name
3)faculty_name = serializers.SlugRelatedField(slug_field='name', read_only=True) --> providing only name in response
1

There are 1 answers

0
A.Deb On

I changed the serializers.py file's code like below

class CourseSerializer(serializers.ModelSerializer):
# print(Faculty.objects.all().values('name'))
faculty = serializers.SlugRelatedField(slug_field='name',queryset=Faculty.objects.all())

class Meta:
    model = Course
    fields = ('name', 'faculty', 'end_date')

and got the required outcome as mentioned.Required outcome