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

