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

