You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django REST Framework中反向展示嵌套关联关系

问题描述

我已经成功实现从Request模型序列化时展示关联的Inspection嵌套字段,输出示例如下:

{
    "reqid": 10,
    "reqdate": "2022-12-05",
    "reqdescription": "Aircon Not working",
    "officerequestor": "OVCAA   ",
    "officeid": "PPD      ",
    "inspection": {
        "insdate": "2022-12-06",
        "diagnosis": "need to buy prism",
        "inspector": "EMP-322 "
    }
},

对应的序列化器代码:

class RequestAdditionDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Inspection
        fields = ['insdate',
                'diagnosis',
                'inspector'
                ]

class RequestorSerializer(serializers.ModelSerializer):
    inspection = RequestAdditionDetailsSerializer(read_only=True)
    class Meta:
        model = Request
        fields = ['reqid',
                'reqdate',
                'reqdescription',
                'officerequestor',
                'officeid',
                'inspection'
                ]

现在我想反向实现:从Inspection模型序列化时,展示关联Request的指定字段为嵌套结构,预期输出如下:

{
"inspectid": 5,
"reqid": "10",
"insdate": "2022-12-06",
"diagnosis": "need to buy prism",
"inspector": "EMP-322",
"isinspected": {
    "reqdescription": "Aircon Not working",
    "reqdate": "2022-12-05",
    "officerequestor": "OVCAA"
   } 
},

我尝试了以下序列化器代码,但不确定是否可行,想问问有没有解决方案;如果没有的话,是不是需要在Inspection表中新增reqdescription、reqdate等字段?

尝试的序列化器代码:

class InspectionAdditionalDetailsViewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Request
        fields = ['reqdescription',
                'reqdate',
                'officerequestor'
                ]

class InspectionSerializer(serializers.ModelSerializer):
    request_details = InspectionAdditionalDetailsViewSerializer(read_only=True)
    class Meta:
        model = Inspection
        fields = ['inspectid',
                'reqid',
                'insdate',
                'diagnosis',
                'inspector',
                'isinspected',
                'request_details'
                ]

我的模型代码:

class Inspection(models.Model):
    inspectid = models.AutoField(primary_key=True)
    reqid = models.OneToOneField('Request', models.DO_NOTHING, db_column='reqid', blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'inspection'

class Request(models.Model):
    reqid = models.AutoField(primary_key=True)

    class Meta:
        managed = False
        db_table = 'request'

解决方案

不需要新增数据库字段,只要调整序列化器的字段配置就能实现需求,具体修改如下:

调整后的序列化器代码

class InspectionAdditionalDetailsViewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Request
        fields = ['reqdescription', 'reqdate', 'officerequestor']

class InspectionSerializer(serializers.ModelSerializer):
    # 通过source参数指定关联的外键字段reqid,同时命名为预期的isinspected
    isinspected = InspectionAdditionalDetailsViewSerializer(source='reqid', read_only=True)
    
    class Meta:
        model = Inspection
        fields = ['inspectid', 'reqid', 'insdate', 'diagnosis', 'inspector', 'isinspected']

关键说明

  1. 你之前的尝试里用了request_details,但这个字段名没有和模型的关联关系绑定,所以无法正确拉取Request的数据。需要通过source='reqid'明确指向Inspection模型中关联Request的外键字段。
  2. 把嵌套字段的名称设为你想要的isinspected,这样序列化后的输出就会和预期结构一致。
  3. 利用现有的OneToOneField关联即可完成嵌套序列化,完全不需要修改数据库表结构。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:10:43