在 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 的可用性和性能!