假设我们有以下模型:

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

这个是可能的吗?如果是这样的话,是如何做到的呢?这是个坏主意吗?

推荐答案

最简单的方法是使用the depth argument

class ClassroomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classroom
        depth = 1

但是,这将只包括正向关系的关系,在本例中,这并不完全是您所需要的,因为教师字段是反向关系.

如果您有更复杂的需求(例如,包括反向关系、嵌套一些字段,但不嵌套其他字段,或者只嵌套特定的字段子集),您可以使用nest serializers,例如...

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参数来指定用作字段源的属性.我们可以删除source参数,而是通过在您的Teacher模型上使用related_name选项来确保teachers属性存在,即.classroom = models.ForeignKey(Classroom, related_name='teachers')

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

Django相关问答推荐

Django的update_or_create失败,尽管指定了kwargs'

Django ORM多表一对多关系问题

如何在Django REST框架中管理序列化程序?

如何在Django模板中有条件地传递值给with变量?

int_list_validator在 Django 表单中不起作用

Django 嵌套事务 - with transaction.atomic()

PyCharm:强制 Django 模板语法突出显示

使用移动应用程序保护通信 [真实性、隐私和完整性]?

Django 从字段开始

在 Django 中,您可以向查询集添加方法吗?

UnicodeDecodeError:asciicodec can't decode byte 0xe0 in position 0: ordinal not in range(128)

如何在django中生成临时文件然后销毁

django 复数模板

related_name 参数在 Django 模型中没有按预期工作?

Django:如何过滤属于特定组的用户

Django/Python初学者:执行python manage.py syncdb时出错-找不到psycopg2

基于 User-Agent 更改 Django 模板

Jinja2中的多级模板继承?

django.urls.path中name参数的作用是什么?

Django - 指定 Django 管理员应该使用哪个模型管理器