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

Django REST Framework消息接口如何返回嵌套用户信息的指定响应格式?

解决方案

问题分析

当前代码存在几个关键问题导致返回格式不符合需求:

  1. MessageModel 中 user 字段的 related_name='user' 命名不合理,易与User模型自身属性冲突
  2. MessageSerializer 里的 created_by 未关联到模型的 user 字段,导致返回时无用户详情数据
  3. 创建消息时未自动关联当前登录用户,且返回格式保留了冗余的 user 字段
  4. 未明确确保时间字段以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:25:40