如何包括使用Django的REST框架相关模型领域?(How do I include relate

2019-07-18 21:34发布

比方说,我们有以下模型:

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
        }, 
    ]
},

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

Answer 1:

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

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的,而不是确保参数teachers属性通过使用存在related_name您选择Teacher的模型,即。 classroom = models.ForeignKey(Classroom, related_name='teachers')

有一点要记住的是,嵌套的序列化目前不支持写入操作。 对于可写的陈述,你应该使用常规平表示,如PK或超链接。



Answer 2:

谢谢@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",)


文章来源: How do I include related model fields using Django Rest Framework?