Сериализация вложенного объекта с помощью 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 не откатывает транзакции)
Как я уже говорил, любая помощь будет очень признательна!