如何使用Django Rest Framework包含相关的模型字段?

假设我们有以下模型:

class Classroom(models.Model): room_number = [....] class Teacher(models.Model): name = [...] tenure = [...] classroom = models.ForeignKey(Classroom) 

让我们说,而不是像ManyRelatedPrimaryKeyField函数得到这样的结果:

 { "room_number": "42", "teachers": [ 27, 24, 7 ] }, 

有它返回的东西,包括完整的相关模型表示,如:

 { "room_number": "42", "teachers": [ { 'id':'27, 'name':'John', 'tenure':True }, { 'id':'24, 'name':'Sally', 'tenure':False }, ] }, 

这可能吗? 如果是这样,怎么样? 这是一个坏主意吗?

最简单的方法是使用深度参数

 class ClassroomSerializer(serializers.ModelSerializer): class Meta: model = Classroom depth = 1 

然而,这只会包括前向关系的关系,在这种情况下,这不是你所需要的,因为教师领域是一个反向关系。

如果你有更复杂的需求(例如,包含反向关系,嵌套一些字段,但不是其他字段,或只嵌套字段的特定子集),可以嵌套序列化程序 ,例如…

 class TeacherSerializer(serializers.ModelSerializer): class Meta: model = Teacher fields = ('id', 'name', 'tenure') class ClassroomSerializer(serializers.ModelSerializer): teachers = TeacherSerializer(source='teacher_set') class Meta: model = Classroom 

请注意,我们使用序列化程序字段上的source参数来指定要用作字段来源的属性。 我们可以通过在Teacher模型上使用related_name选项来确保teachers属性存在,而不是使用source参数。 classroom = models.ForeignKey(Classroom, related_name='teachers')

有一点要记住,嵌套序列化器目前不支持写入操作。 对于可写表示,您应该使用普通的平面表示,例如pk或超链接。

谢谢@TomChristie! 你帮了我很多! 我想稍微更新一下(因为我遇到了一个错误)

 class TeacherSerializer(serializers.ModelSerializer): class Meta: model = Teacher fields = ('id', 'name', 'tenure') class ClassroomSerializer(serializers.ModelSerializer): teachers = TeacherSerializer(source='teacher_set', many=True) class Meta: model = Classroom field = ("teachers",)