Хотите получить значение внешнего ключа вместо целого объекта с помощью сериализаторов django-rest-framework

Я использую фреймворк Django rest для создания API. У меня есть следующие модели: 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


Для создания сериализатора 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')

Чтобы создать службы отдыха, используйте следующие представления:

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)

Получение объекта Faculty при обращении к конечной точке /course/, как показано на изображении. хотите получить имя факультета вместо объекта Faculty в полях формы метода post (выпадающий список)

Я попробовал следующие коды:

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

Я изменил код файла serializers.py следующим образом

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')

и получил требуемый результат, как указано.Required outcome

Вернуться на верх