Django сериализует вложенный объект в 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 и вернуть во фронтенд:

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`` возвращает первичный ключ (ID записи).

Я прочитал 100500 вопросов по SA, некоторые люди говорят, что нужно писать пользовательские сериализаторы.

ок, я напишу это.

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-й день этой проблемы и я пишу сюда, чтобы попросить помощи.

Как сериализовать объекты ForumSubSection с объектами ForumSection?

Я думаю, что это должно быть:

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 или вы можете получить доступ к data непосредственно из класса ForumSubSectionSerializer(qs, many=True).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.

Вернуться на верх