Django Rest Framework中嵌套关系的JSON序列化

Django Rest Framework (DRF) 中,处理嵌套关系的 JSON 序列化是一个常见需求。以下是如何实现嵌套关系序列化的详细说明,包括序列化器定义、模型关系以及常见用法。

1、问题背景

假设我们有以下两个模型:

复制代码
class Jobdtl(models.Model):
    jobdtl_id = models.IntegerField(primary_key=True)
    jobdtl_cmd = models.TextField(blank=True)
    jobdtl_envfile = models.TextField(blank=True)
    jobdtl_retnsn = models.SmallIntegerField(blank=True, null=True)
    jobdtl_allowadhoc = models.CharField(max_length=1, blank=True)
    jobdtl_waitop = models.CharField(max_length=1, blank=True)

    class Meta:
        managed = False
        db_table = 'jobdtl'

class Jobmst(models.Model):
    jobmst_id = models.IntegerField(primary_key=True)
    jobmst_prntid = models.IntegerField(blank=True, null=True)
    jobmst_active = models.CharField(max_length=1, blank=True)
    jobmst_evntoffset = models.SmallIntegerField(blank=True, null=True)
    jobmst_name = models.TextField(blank=True)
    jobmst_owner = models.IntegerField(blank=True, null=True)
    jobmst_crttm = models.DateTimeField()
    jobdtl_id = models.ForeignKey('Jobdtl', db_column='jobdtl_id', related_name='mstdtl', blank=True, null=True)
    jobmst_lstchgtm = models.DateTimeField(blank=True, null=True)
    def __unicode__(self):
        return self.jobmst_name   
    class Meta:
        managed = False
        db_table = 'jobmst'

我们希望能够将这两个模型的数据序列化成一个嵌套的JSON格式,类似于如下格式:

复制代码
{
  "jobmst": {
    "jobmst_id": 1,
    "jobmst_prntid": null,
    "jobmst_active": "Y",
    "jobmst_evntoffset": null,
    "jobmst_name": "Job 1",
    "jobmst_owner": 1001,
    "jobmst_crttm": "2023-03-08T16:33:19.439773Z",
    "jobdtl_id": 1,
    "jobmst_lstchgtm": null
  },
  "jobdtl": {
    "jobdtl_id": 1,
    "jobdtl_cmd": "echo Hello World",
    "jobdtl_envfile": null,
    "jobdtl_retnsn": 0,
    "jobdtl_allowadhoc": "Y",
    "jobdtl_waitop": "N"
  }
}

2、解决方案

2.1 编写序列化器

首先,我们需要为这两个模型编写序列化器,以便将模型数据转换为JSON格式。

python 复制代码
class JobmstSerializer(serializers.ModelSerializer):
    jobdtl_id = JobdtlSerializer()

    class Meta:
        model = Jobmst

class JobdtlSerializer(serializers.ModelSerializer):
    class Meta:
        model = Jobdtl

2.2 编写视图

接下来,我们需要编写一个视图来处理HTTP请求,并使用序列化器将模型数据序列化成JSON格式。

python 复制代码
class ResultsList(ListAPIView):
    def list(self, request, *args, **kwargs):
        jobmstquery = Jobmst.objects.using('Admiral').all()
        jobdtlquery = Jobdtl.objects.using('Admiral').all()

        results = list()
        entries = list(chain(jobmstquery, jobdtlquery)) # combine the two querysets
        for entry in entries:
            type = entry.__class__.__name__.lower() # 'jobmst', 'jobdtl'
            if isinstance(entry, Jobmst):
                serializer = JobmstSerializer(entry)
                dictionary = {'type': type, 'jobmst_data': serializer.data}
            if isinstance(entry, Jobdtl):
                serializer = JobdtlSerializer(entry)
                dictionary = {'type': type, 'jobdtl_data': serializer.data}
            results.append(dictionary)
        return Response(results)

2.3 配置URL路由

最后,我们需要在URL路由中配置视图,以便当用户访问特定URL时,能够调用相应的视图。

python 复制代码
urlpatterns = patterns('TidalDEV.views',
    url(r'^TidalDEV/$', 'ResultsList'),
    url(r'^TidalDEV/(?P<pk>[0-9]+)/$', 'ResultsList'),
)

2.4 测试结果

现在,我们可以通过访问URL来测试我们的API。例如,访问URL http://localhost/TidalDEV/,会返回所有Jobmst和Jobdtl模型数据的JSON序列化结果。访问URL http://localhost/TidalDEV/50244/,会返回Jobmst和Jobdtl模型数据的JSON序列化结果,其中Jobmst的jobmst_id为50244。

总结

通过以上步骤,我们实现了在Django Rest Framework中对嵌套关系的JSON序列化。这为我们提供了更加灵活的方式来处理复杂的数据结构,并将其转换为JSON格式。

这样可以高效处理复杂的嵌套关系,提升 API 的可用性和性能!

相关推荐
伶俜661 天前
鸿蒙原生应用实战(十八)ArkUI 记账本:SQLite 账单 + 图表统计 + 分类管理
jvm·sqlite·harmonyos
码云骑士1 天前
31-慢查询排查全流程(上)-Django-Debug-Toolbar与EXPLAIN入门
后端·python·django
龙腾AI白云1 天前
数字孪生和世界模型,二者的技术边界正在慢慢融合吗?
人工智能·django·知识图谱
terry6001 天前
5G视频短信服务商选型全攻略:通道资源、架构能力与成本评估2026最新标准
大数据·人工智能·5g·json·asp.net·信息与通信·数据库架构
伶俜661 天前
鸿蒙原生应用实战(二十)ArkUI 课程表 App:Grid 网格 + SQLite 存储 + 周次切换 + 上课提醒
华为·sqlite·harmonyos
前网易架构师-高司机1 天前
带标注的辣椒病叶数据集,识别率95.9%,可识别三种病害和健康叶子,9916张图,支持yolo,coco json,voc xml,文末有模型训练代码
yolo·json·数据集·病害·叶病·病叶·辣椒
码云骑士1 天前
30-在线图书管理系统-Django从零搭建到上线部署完整实战
后端·python·django
PixelBai1 天前
JSON扁平化使用教程:从入门到精通
json
2601_961875242 天前
花生十三资源盘|电子版|全科
python·django·flask·virtualenv·scikit-learn·pygame·tornado