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

标签 python django django-rest-framework

假设我们有以下模型:

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

请注意,我们使用序列化器字段上的源参数来指定要用作字段源的属性。我们可以通过使用 related_name 确保 teachers 属性存在来删除 source 参数。 Teacher 模型上的选项,即。 classroom = models.ForeignKey(Classroom,related_name='teachers')

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

关于python - 如何使用 Django Rest Framework 包含相关模型字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573102/

相关文章:

python - 将 Django 所需的表单字段更改为 False

javascript - 如何在单个 Django View 中进行两个或多个 AJAX 调用

django - 带有动态字段的 django rest 框架中的序列化程序

python - 使用记录器对象而不是使用日志记录有什么好处?

python - pytest-html extras 自定义代码理解

python - 跨数组求和模式

python - 转换为角色

python - 为什么 Django-Simple-Captcha 图像扭曲?

python - Django 1.11 get() 缺少 1 个必需的位置参数 : 'pk'

python - SignatureDoesNotMatch - Boto3 Django 存储