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

如何在Django REST API中返回帖子作者的用户名而非用户ID?

解决Django REST API返回用户ID而非用户名的问题

我来帮你搞定这个问题!目前你的API返回author: 1是因为Django REST Framework的ModelSerializer默认会把外键字段序列化为关联对象的主键值。要让它返回用户名,有几种简单的修改方式,你可以根据需求选择:

方法1:使用StringRelatedField(最简单)

这个字段会直接调用关联对象的__str__方法返回字符串。Django默认的User模型__str__方法返回的就是用户名,刚好符合你的需求。修改你的serializer.py:

from rest_framework import serializers
from .models import PostDetail
from django.contrib.auth import get_user_model

User = get_user_model()

class PostDetailSerializer(serializers.ModelSerializer):
    # 新增这一行,指定author字段用StringRelatedField序列化
    author = serializers.StringRelatedField()

    class Meta:
        model = PostDetail
        # 注意这里要给字段名加引号,你原来的代码里author和title没加引号会报错!
        fields = ('author', 'title', 'contents', )

方法2:用SerializerMethodField自定义返回内容

如果之后需要更灵活的返回(比如同时返回用户名和邮箱),可以用这个方法手动指定返回值:

from rest_framework import serializers
from .models import PostDetail
from django.contrib.auth import get_user_model

User = get_user_model()

class PostDetailSerializer(serializers.ModelSerializer):
    author = serializers.SerializerMethodField()

    # 定义get_xxx方法,xxx对应字段名
    def get_author(self, obj):
        # 直接返回关联用户的username属性
        return obj.author.username

    class Meta:
        model = PostDetail
        fields = ('author', 'title', 'contents', )

方法3:嵌套用户序列化器(适合需要多用户字段的场景)

如果之后想返回更多用户信息(比如邮箱、昵称),可以创建一个单独的用户序列化器并嵌套进去:

from rest_framework import serializers
from .models import PostDetail
from django.contrib.auth import get_user_model

User = get_user_model()

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', )  # 可以添加其他字段比如'email', 'first_name'

class PostDetailSerializer(serializers.ModelSerializer):
    author = UserSerializer()

    class Meta:
        model = PostDetail
        fields = ('author', 'title', 'contents', )

这种方式返回的结构会是"author": {"username": "admin"},适合需要展示更多用户信息的场景。

另外还要提醒你:原来的serializer代码里fields = (author, title, 'contents', )这里的author和title没有加引号,这会导致Python报错,一定要改成带引号的字符串哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:33:39