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 标志传递给序列化程序。