如何使用Django REST框架包括相关的模型字段?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

假设我们有以下模式:

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参数,以确保teachers属性存在。你的选择Teacher模特儿classroom = models.ForeignKey(Classroom, related_name='teachers')

需要记住的一点是,嵌套序列化程序目前不支持写操作。对于可写表示,应该使用常规的平面表示形式,例如PK或超链接。

用户回答回答于

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

扫码关注云+社区