如何在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']
关键说明
- 你之前的尝试里用了
request_details,但这个字段名没有和模型的关联关系绑定,所以无法正确拉取Request的数据。需要通过source='reqid'明确指向Inspection模型中关联Request的外键字段。 - 把嵌套字段的名称设为你想要的
isinspected,这样序列化后的输出就会和预期结构一致。 - 利用现有的
OneToOneField关联即可完成嵌套序列化,完全不需要修改数据库表结构。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

