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

Django序列化Service表外键name返回数字而非字符串如何解决

问题原因

Django REST Framework的ModelSerializer默认对外键类型字段序列化时,仅返回关联对象的主键ID,你的Service模型中name字段是关联CustomUser的外键,所以默认序列化结果为用户ID而非用户名。

解决方法

根据你的使用场景可以选以下任意一种方案修改ServiceSerializer:

方案1:直接返回用户名字段(仅读场景,最简单)

直接指定序列化后的name字段取关联用户的username属性:

from rest_framework import serializers
from .models import *

class ServiceSerializer(serializers.ModelSerializer):
    # 新增该行,source指定关联字段的属性,read_only表示仅用于返回
    name = serializers.CharField(source='name.username', read_only=True)
    class Meta:
        model = Service
        fields = '__all__'

方案2:调用关联对象的__str__方法返回

如果你已经自定义了CustomUser的__str__方法(默认继承AbstractUser的__str__就是返回username),可以用StringRelatedField:

class ServiceSerializer(serializers.ModelSerializer):
    name = serializers.StringRelatedField(read_only=True)
    class Meta:
        model = Service
        fields = '__all__'

方案3:兼顾读写需求

如果你需要同时支持提交用户ID创建/更新服务,又需要返回用户名展示,可以拆分两个字段:

class ServiceSerializer(serializers.ModelSerializer):
    # 新增用户名字段用于展示
    worker_name = serializers.CharField(source='name.username', read_only=True)
    class Meta:
        model = Service
        # 显式声明字段,保留原来的name字段用于传入用户ID,新增worker_name用于展示
        fields = ['id', 'service', 'name', 'worker_name']

方案4:返回更多用户信息(嵌套序列化)

如果需要返回用户的多个字段(比如用户名、手机号、邮箱等),可以用嵌套序列化:

# 先定义一个精简的用户序列化器
class CustomUserSimpleSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = ['id', 'username', 'first_name', 'email'] # 按需添加要返回的字段

class ServiceSerializer(serializers.ModelSerializer):
    name = CustomUserSimpleSerializer(read_only=True)
    class Meta:
        model = Service
        fields = '__all__'

内容的提问来源于stack exchange,提问作者user14653534

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:06:08