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

