Вложенные сериализаторы Django - Прямое присвоение обратной стороне связанного множества запрещено
Я хочу реализовать свою собственную функцию создания на моем сериализаторе, но я получаю следующую ошибку:
TypeError: Прямое присвоение обратной стороне связанного множества запрещено. Вместо этого используйте lines.set().
Мой models.py
from django.db import models
class Cheatsheet(models.Model):
title = models.CharField(max_length=500)
description = models.CharField(max_length=500)
score = models.IntegerField()
def __str__(self):
return self.title
class Section(models.Model):
title = models.CharField(max_length=500)
description = models.CharField(max_length=500)
cheatsheet = models.ForeignKey(Cheatsheet, on_delete=models.CASCADE, related_name='sections', null=True, blank=True)
def __str__(self):
return self.title
class Line(models.Model):
description = models.CharField(max_length=500)
snippet = models.CharField(max_length=500)
section = models.ForeignKey(Section, on_delete=models.CASCADE, related_name='lines', null=True, blank=True)
def __str__(self):
return self.description
Мой serializers.py
from rest_framework import serializers
from .models import Cheatsheet, Section, Line
class LineSerializer(serializers.ModelSerializer):
class Meta:
model = Line
fields = "__all__"
class SectionSerializer(serializers.ModelSerializer):
lines = LineSerializer(many=True)
class Meta:
model = Section
fields = "__all__"
def create(self, validated_data):
lines_data = validated_data.pop('lines')
section = Section.objects.create(**validated_data)
for line in lines_data:
Line.objects.create(section=section, **line)
return section
class CheatsheetSerializer(serializers.ModelSerializer):
sections = SectionSerializer(many=True)
class Meta:
model = Cheatsheet
fields = "__all__"
def create(self, validated_data):
sections_data = validated_data.pop('sections')
print(sections_data)
cheatsheet = Cheatsheet.objects.create(**validated_data)
print(cheatsheet)
for section in sections_data:
Section.objects.create(cheatsheet=cheatsheet, **section)
return cheatsheet
Мой views.py
from api.serializers import CheatsheetSerializer
from .models import Cheatsheet
from rest_framework import viewsets
class CheatsheetViewSet(viewsets.ModelViewSet):
queryset = Cheatsheet.objects.all()
serializer_class = CheatsheetSerializer
А это json, который я отправляю в запросе:
{
"title": "Cheatsheet title",
"description": "Cheatsheet description",
"score": 24,
"sections": [
{
"title": "Section title",
"description": "Section description",
"lines": [
{
"description": "Line description",
"snippet": "line snippet"
},
{
"description": "Line description2",
"snippet": "line snippet2"
}
]
}
]
}
Я следовал этому руководству , но не могу понять, почему мой код не работает. В других ответах предлагается использовать set() вместо get(), но я не думаю, что это мой случай.
То, как вы обрабатывали данные строки в SectionSerializer
, должно быть сделано и в CheatsheetSerializer
, так что что-то вроде:
class CheatsheetSerializer(serializers.ModelSerializer):
# ...
for section in sections_data:
# pop the lines
lines_data = section.pop('lines')
section = Section.objects.create(cheatsheet=cheatsheet, **section)
# and create them after the section:
for line in lines_data:
Line.objects.create(section=section, **line)