Django REST Framework消息接口如何返回嵌套用户信息的指定响应格式?
解决方案
问题分析
当前代码存在几个关键问题导致返回格式不符合需求:
MessageModel中user字段的related_name='user'命名不合理,易与User模型自身属性冲突MessageSerializer里的created_by未关联到模型的user字段,导致返回时无用户详情数据- 创建消息时未自动关联当前登录用户,且返回格式保留了冗余的
user字段 - 未明确确保时间字段以UTC格式返回(DRF默认支持,但可按需自定义)
分步修复代码
1. 修正模型的关联名称
修改 MessageModel 的 user 字段 related_name,避免命名冲突:
from django.db import models from django.contrib.auth.models import User from django.utils.timezone import now class MessageModel(models.Model): message = models.CharField(max_length=100) created_at = models.DateTimeField(default=now) updated_at = models.DateTimeField(default=now) # 修正related_name,改为更清晰的命名 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='messages')
2. 调整序列化器映射关系
修改 MessageSerializer,将 created_by 关联到 user 字段,并移除冗余的 user 字段:
from rest_framework.serializers import ModelSerializer from django.contrib.auth import get_user_model from .models import MessageModel User = get_user_model() class UserSerializer(ModelSerializer): class Meta: model = User fields = ['id','username','email'] class MessageSerializer(ModelSerializer): # 指定source为user,将模型的user字段序列化为用户详情 created_by = UserSerializer(read_only=True, source='user') # 可选:自定义UTC时间格式(DRF默认已为UTC格式,此步可省略) created_at = models.DateTimeField(format='%Y-%m-%dT%H:%M:%SZ', read_only=True) updated_at = models.DateTimeField(format='%Y-%m-%dT%H:%M:%SZ', read_only=True) class Meta: model = MessageModel # 只保留需求中的字段 fields = ['id','message', 'created_at', 'updated_at','created_by']
3. 视图中自动关联当前用户
重写 MessageViewSet 的 perform_create 方法,创建消息时自动赋值当前登录用户,无需前端传递 user 参数:
from rest_framework import viewsets from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated from .models import MessageModel from .serializers import MessageSerializer class MessageViewSet(viewsets.ModelViewSet): authentication_classes = [TokenAuthentication] permission_classes = [IsAuthenticated] queryset = MessageModel.objects.all() serializer_class = MessageSerializer # 重写创建逻辑,自动绑定当前登录用户 def perform_create(self, serializer): serializer.save(user=self.request.user)
最终返回格式
完成上述修改后,创建消息的响应格式将符合需求:
{ "id": 102, "message": "Lorem ipsum", "created_at": "2022-11-07T09:21:19Z", "updated_at": "2022-11-07T09:21:19Z", "created_by": { "id": 3, "username": "testuser", "email": "test@mail.com" } }
内容的提问来源于stack exchange,提问作者user17143140
相关产品推荐
相关产品推荐

