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
.