如何在Django REST Framework序列化器中获取外键名称而非整个对象
解决Django REST Framework中外键字段表单显示名称的问题
正确配置方案
使用SlugRelatedField,同时指定queryset参数(不要设置read_only=True,否则表单不会渲染可选下拉框),这样POST表单会显示Faculty的name作为选项,接口响应也会返回对应的名称值。
示例代码:
from rest_framework import serializers from .models import Course, Faculty class CourseSerializer(serializers.ModelSerializer): faculty_name = serializers.SlugRelatedField( slug_field='name', queryset=Faculty.objects.all() ) class Meta: model = Course fields = ['id', 'name', 'faculty_name'] # 按需添加其他业务字段
之前配置失效的原因
- 使用
FacultySerializer():嵌套序列化会返回完整的Faculty对象结构,但DRF默认表单不会将嵌套序列器渲染为下拉选择控件,因此看不到教师选项列表。 - 使用
ReadOnlyField(source='faculty.name'):该字段为只读属性,仅在GET响应中显示值,不会出现在POST输入表单里,所以直接隐藏了选择项。 - 使用
SlugRelatedField(slug_field='name', read_only=True):read_only=True会让字段脱离表单输入逻辑,仅在响应中返回名称,自然无法生成下拉选择框。
进阶优化(兼顾表单与响应需求)
如果需要POST表单用名称选择,同时GET响应返回更多Faculty详情,可以结合SerializerMethodField和SlugRelatedField拆分读写逻辑:
class CourseSerializer(serializers.ModelSerializer): # 仅用于POST表单选择,不返回给前端 faculty_name = serializers.SlugRelatedField( slug_field='name', queryset=Faculty.objects.all(), write_only=True ) # 用于GET响应返回教师详细信息 faculty_info = serializers.SerializerMethodField() def get_faculty_info(self, obj): return { 'id': obj.faculty_name.id, 'name': obj.faculty_name.name, 'department': obj.faculty_name.department # 按需添加其他字段 } class Meta: model = Course fields = ['id', 'name', 'faculty_name', 'faculty_info']
内容的提问来源于stack exchange,提问作者A.Deb
相关产品推荐
相关产品推荐

