Вложенные сериализаторы 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)
Вернуться на верх