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
相关产品推荐
相关产品推荐

