假设我们有以下模型:
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 }, ] },
这可能吗?如果是这样,怎么办?这是一个坏主意吗?
最简单的方法是使用depth参数
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参数来指定用作字段源的属性。我们可以通过使用模型上的related_name选项source来确保teachers属性存在,从而删除参数。Teacherclassroom = models.ForeignKey(Classroom, related_name='teachers')
source
related_name
teachers
Teacherclassroom = models.ForeignKey(Classroom, related_name='teachers')
要记住的一件事是,嵌套的序列化程序当前不支持写操作。对于可写表示形式,应使用常规的平面表示形式,例如pk或超链接。