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

如何将RoomSerializer输出嵌入JoinedRoomSerializer?Django序列化问题

问题解决方法

错误原因很明确:room_extends不是UserRoom模型的属性,你得让序列化器知道从UserRoom关联的Room外键字段里取数据。

步骤1:确认外键字段名

先检查你的UserRoom模型,关联Room的外键字段名应该是类似这样的:

class UserRoom(models.Model):
    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    date_joined = models.DateTimeField(auto_now_add=True)
    # 其他字段...

这里的外键字段名是room,这是关键。

步骤2:修改序列化器

有两种方式修复:

方式一:用source指定关联字段

保留你想要的room_extends字段名,通过source参数指向实际的外键字段:

class RoomSerializer(serializers.ModelSerializer):
    """Serializer for displaying all fields of the Room"""
    class Meta():
        model = Room
        fields = ['name']

class JoinedRoomSerializer(serializers.ModelSerializer):
    """Serializer for displaying the following fields of the joined UserRoom table"""
    room_extends = RoomSerializer(source='room')  # 这里source指向UserRoom的外键字段room

    class Meta():
        model = UserRoom
        fields = ['room_extends', 'date_joined']

方式二:直接使用外键字段名

如果可以接受用外键字段名作为输出字段,直接定义即可:

class JoinedRoomSerializer(serializers.ModelSerializer):
    """Serializer for displaying the following fields of the joined UserRoom table"""
    room = RoomSerializer()

    class Meta():
        model = UserRoom
        fields = ['room', 'date_joined']

注意点

  • 去掉many=True:外键是多对一关系(多个UserRoom对应一个Room),单个UserRoom实例只关联一个Room,所以不需要many=True,否则会报错“期望可迭代对象但得到Room实例”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:54:59