Сериализация вложенного объекта с помощью Django Rest Framework

В настоящее время я пытаюсь сериализовать следующий объект в перечисленные ниже модели, текущее отношение

Категория имеет много викторин, викторина принадлежит одной категории, но содержит много вопросов, вопрос принадлежит викторине, но содержит много вариантов ответа. Любая помощь будет очень признательна!

Вот последняя ошибка, которую я получал:

AttributeError: Получена ошибка AttributeError при попытке получить значение для поля choices на сериализаторе QuestionSerializer. Поле сериализатора может быть названо неверно и не соответствовать какому-либо атрибуту или ключу экземпляра RelatedManager. Оригинальный текст исключения был: 'RelatedManager' object has no attribute 'choices'.

{
    "category": 1,
    "title": "Basic Java",
    "question": {
        "title": "Boolenas",
        "text" : "adafasad",
        "correct_words": [],
        "choice_type": "SINGLE",
        "choices": [
            {
                "text": "asdadawd",
                "is_correct": true
            },
            {
                "text": "adwasda",
                "is_correct": false
            },
            {
                "text": "asdawd",
                "is_correct": false
            }
        ]
    }
}

Модели следующие:

class Category(models.Model):
    title = models.CharField(max_length=50)
    
    def __str__(self) -> str:
        return self.title
    
    class Meta: 
        verbose_name_plural = 'Categories'

class Quiz(models.Model):
    title = models.CharField(max_length=100)
    created_date = models.DateTimeField(auto_now_add=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    def __str__(self) -> str:
        return self.title
    
    class Meta:
        verbose_name_plural = 'Quizzes'

class Question(models.Model):
    title = models.CharField(max_length=100, default='placeholder')
    text = models.CharField(max_length=200, null=True)
    correct_words = ArrayField(models.CharField(max_length=255), blank=True, null=True)
    # choice_type = models.CharField(max_length=50)
    created_date = models.DateTimeField(auto_now_add=True)
    quiz = models.ForeignKey(Quiz, related_name='questions', on_delete=models.CASCADE)
    
    
class Choice(models.Model):
    text = models.CharField(max_length=200, null=True)
    is_correct = models.BooleanField(default=False)
    created_date = models.DateTimeField(auto_now_add=True)
    question = models.ForeignKey(Question, related_name='choices', on_delete=models.CASCADE, default=1)

И, наконец, вот мои сериализаторы:

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields= ('id', 'title')
        
    def validate(self, data):
        if Category.objects.filter(title=data.get('title')).exists():
            raise serializers.ValidationError("Category with this name already exists.")
        return data
            
        
class ChoiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Choice
        fields = ['text', 'is_correct']

class QuestionSerializer(serializers.ModelSerializer):
    choices = ChoiceSerializer(many=True)

    class Meta:
        model = Question
        fields = ['title', 'text', 'correct_words', 'choices']

class QuizSerializer(serializers.ModelSerializer):
    question = QuestionSerializer(source='questions')

    class Meta:
        model = Quiz 
        fields = ['category', 'title', 'question', 'created_date']
        
    def create(self, validated_data):
        print(validated_data)
        category_data = validated_data.pop('category')
        question_data = validated_data.pop('questions')
        choices_data = question_data.pop('choices')

        quiz = Quiz.objects.create(category=category_data, title=validated_data['title']) 
        
        question = Question.objects.create(quiz=quiz, **question_data)
        
        for choice_data in choices_data:
            choice = Choice.objects.create(question=question, **choice_data)

        return quiz

Я предполагаю, что проблема возникает, когда я пытаюсь сериализовать объекты обратно в ответ, поскольку объекты сохраняются в базе данных (или это может быть просто DJANGO не откатывает транзакции)

Как я уже говорил, любая помощь будет очень признательна!

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