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

Django Serializer字段异常求助:查阅相关问题仍未找到解决办法

解决Django Rest Framework序列化器返回target字段为用户详情的问题

看起来你应该是希望把返回结果里的target字段也像sender一样,返回关联用户的详细信息而不是单纯的ID对吧?我来帮你调整这个序列化器:

修改后的Serializer代码

from rest_framework import serializers
from .models import Messages
from .serializers import UserMobileSerializer  # 确保导入正确的用户序列化器

class MessageSerializer(serializers.ModelSerializer):
    sender = UserMobileSerializer(read_only=True)
    # 新增target字段的嵌套序列化
    target = UserMobileSerializer(read_only=True)

    class Meta:
        model = Messages
        fields = '__all__'

如果需要支持创建消息时传入target ID(同时返回详情)

如果你的业务场景需要在创建消息时传入target的ID,同时返回时展示用户详情,可以用SerializerMethodField来实现:

class MessageSerializer(serializers.ModelSerializer):
    sender = UserMobileSerializer(read_only=True)
    target = serializers.SerializerMethodField()

    def get_target(self, obj):
        # 序列化关联的target用户对象
        return UserMobileSerializer(obj.target).data

    class Meta:
        model = Messages
        fields = '__all__'
        # 允许创建时传入target的ID
        extra_kwargs = {
            'target': {'write_only': False}
        }

修改后的返回结果示例

调整后,你的接口返回会变成这样:

{
    "id": 62,
    "sender": {
        "pk": 12,
        "email": "john@gmail.com",
        "full_name": "John",
        "profile_photo": null
    },
    "target": {
        "pk": 18,
        "email": "jane@example.com",
        "full_name": "Jane Doe",
        "profile_photo": "https://example.com/user-profile.jpg"
    },
    "created_at": "2018-04-29T00:54:50.437662",
    "message": "sdkjnasljdhkajsjdlasdasda",
    "read_at": false
}

注意事项

  • 确保你的Messages模型中target字段是关联到User模型的外键,否则需要调整序列化逻辑适配你的关联关系
  • 如果target字段可能为null,UserMobileSerializer会自动处理为null,无需额外配置
  • 如果UserMobileSerializer有自定义的字段筛选,返回的target详情会和sender保持一致的字段结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:27:19