You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:42:19