想要使用 django-rest-framework 序列化器检索外键值而不是整个对象

问题描述 投票:0回答:1

我正在使用 Django Rest 框架来创建 API。我有以下型号: 模型.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


创建序列化器 序列化器.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)

如镜像所显示,在访问/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
django django-rest-framework django-serializer
1个回答
0
投票

__str__
实现
Faculty
方法:

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)

    def __str__(self):
        return self.name

注意:A

ForeignKey
not 存储字符串表示形式(或名称) 列中引用的对象,它存储它的记录的主键 列中带有
_id
后缀的引用指向
ForeignKey
字段。所以
ForeignKey
通常
_name
后缀结尾。你可能想要 考虑将
faculty_name
字段重命名为
faculty


注意:指定

null=False
 [Django-doc] 不是必需的:字段默认情况下不可为 NULL。

© www.soinside.com 2019 - 2024. All rights reserved.