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

发布于 2021-01-29 19:33:45

假设我们有以下模型:

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

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

关注者
0
被浏览
91
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    最简单的方法是使用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属性存在,从而删除参数。Teacher``classroom = models.ForeignKey(Classroom, related_name='teachers')

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看