Django 将嵌套对象序列化为 json
Django serialise nested object into json
我有两个模型:
modesl.py
class ForumSection(models.Model):
title = models.CharField(max_length=20)
description = models.CharField(max_length=300)
order = models.IntegerField(default=0)
def __str__(self):
return self.title
class ForumSubSection(models.Model):
section = models.ForeignKey(ForumSection, on_delete=models.CASCADE)
title = models.CharField(max_length=20)
description = models.CharField(max_length=300)
order = models.IntegerField(default=0)
def __str__(self):
return self.title
我尝试将小节序列化为 json 和 return 到前端:
def ajax_create_forum_subsection(request):
.......
sections = ForumSubSection.objects.all().order_by('pk')
data = serialize("json", sections, fields=('pk', 'title', 'description', 'order', 'section'))
return JsonResponse(data, safe=False)
但是 ``section``` return 主键(记录的 ID)。
我在 SA 上阅读了 100500 个问题,有些人说要编写自定义序列化程序。
好的,我写了
serializers.py
from rest_framework import serializers
from .models import *
class ForumSectionSerializer(serializers.ModelSerializer):
class Meta:
model = ForumSection
fields = '__all__'
def create(validated_data):
return ForumSection.objects.create(**validated_data)
class ForumSubSectionSerializer(serializers.ModelSerializer):
section = ForumSectionSerializer(read_only=True)
class Meta:
model = ForumSubSection
fields = ['pk', 'title', 'description', 'order', 'section']
depth = 1
def create(validated_data):
return ForumSubSection.objects.create(**validated_data)
并尝试使用它。
def ajax_edit_forum_subsection(request):
.......
qs = ForumSubSection.objects.all().order_by('pk')
ser = ForumSubSectionSerializer(qs)
data = ser.serialize("json", qs, fields=('pk', 'title', 'description', 'order', 'section'))
return JsonResponse(data, safe=False)
它调用服务器错误 500 并且不起作用。
现在是这个问题的第 5 天,我在这里写信寻求帮助。
如何用 ForumSection 对象序列化 ForumSubSection 对象?
我觉得应该是:
def ajax_edit_forum_subsection(request):
.......
qs = ForumSubSection.objects.all().order_by('pk')
ser = ForumSubSectionSerializer(qs, many=True)
return JsonResponse(ser.data, safe=False)
ser = ForumSubSectionSerializer(qs, many=True)
已经为您序列化了数据。您需要做的就是:使用 ser.data
从中获取数据,或者您可以直接从 class ForumSubSectionSerializer(qs, many=True).data
.
访问 data
def ajax_edit_forum_subsection(request):
qs = ForumSubSection.objects.all().order_by('pk')
ser = ForumSubSectionSerializer(qs, many=True).data # <- data here
return JsonResponse(ser, safe=False)
注意 many=Trye
参数。如果表示应该是项目列表,则应将 many=True
标志传递给序列化程序。
我有两个模型:
modesl.py
class ForumSection(models.Model):
title = models.CharField(max_length=20)
description = models.CharField(max_length=300)
order = models.IntegerField(default=0)
def __str__(self):
return self.title
class ForumSubSection(models.Model):
section = models.ForeignKey(ForumSection, on_delete=models.CASCADE)
title = models.CharField(max_length=20)
description = models.CharField(max_length=300)
order = models.IntegerField(default=0)
def __str__(self):
return self.title
我尝试将小节序列化为 json 和 return 到前端:
def ajax_create_forum_subsection(request):
.......
sections = ForumSubSection.objects.all().order_by('pk')
data = serialize("json", sections, fields=('pk', 'title', 'description', 'order', 'section'))
return JsonResponse(data, safe=False)
但是 ``section``` return 主键(记录的 ID)。
我在 SA 上阅读了 100500 个问题,有些人说要编写自定义序列化程序。
好的,我写了
serializers.py
from rest_framework import serializers
from .models import *
class ForumSectionSerializer(serializers.ModelSerializer):
class Meta:
model = ForumSection
fields = '__all__'
def create(validated_data):
return ForumSection.objects.create(**validated_data)
class ForumSubSectionSerializer(serializers.ModelSerializer):
section = ForumSectionSerializer(read_only=True)
class Meta:
model = ForumSubSection
fields = ['pk', 'title', 'description', 'order', 'section']
depth = 1
def create(validated_data):
return ForumSubSection.objects.create(**validated_data)
并尝试使用它。
def ajax_edit_forum_subsection(request):
.......
qs = ForumSubSection.objects.all().order_by('pk')
ser = ForumSubSectionSerializer(qs)
data = ser.serialize("json", qs, fields=('pk', 'title', 'description', 'order', 'section'))
return JsonResponse(data, safe=False)
它调用服务器错误 500 并且不起作用。
现在是这个问题的第 5 天,我在这里写信寻求帮助。
如何用 ForumSection 对象序列化 ForumSubSection 对象?
我觉得应该是:
def ajax_edit_forum_subsection(request):
.......
qs = ForumSubSection.objects.all().order_by('pk')
ser = ForumSubSectionSerializer(qs, many=True)
return JsonResponse(ser.data, safe=False)
ser = ForumSubSectionSerializer(qs, many=True)
已经为您序列化了数据。您需要做的就是:使用 ser.data
从中获取数据,或者您可以直接从 class ForumSubSectionSerializer(qs, many=True).data
.
data
def ajax_edit_forum_subsection(request):
qs = ForumSubSection.objects.all().order_by('pk')
ser = ForumSubSectionSerializer(qs, many=True).data # <- data here
return JsonResponse(ser, safe=False)
注意 many=Trye
参数。如果表示应该是项目列表,则应将 many=True
标志传递给序列化程序。