如何使用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",)