Переопределенный метод create не сохраняет поле экземпляра в Django Rest Framework - PullRequest
0 голосов
/ 09 мая 2018

Я работаю с вложенными сериализаторами в моем проекте. Есть только одна маленькая проблема, с которой я сталкиваюсь и не могу угадать, что происходит не так.

У меня есть две модели: -
Модель 1: -

class Answer_Options(models.Model):
    text = models.CharField(max_length=200)

Модель 2: -

class Quiz_Question(models.Model):
    text = models.CharField(max_length=200)
    possible_answers = models.ManyToManyField(Answer_Options)
    correct = models.ForeignKey(Answer_Options, related_name="correct", default=None, on_delete=models.CASCADE, blank=True, null=True)

Я создал следующие сериализаторы для моих моделей выше: -

class Answer_OptionsSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Answer_Options
        fields = ('url', 'text')

А для викторины Вопрос: -

class Quiz_QuestionSerializer(serializers.HyperlinkedModelSerializer):
    possible_answers = Answer_OptionsSerializer(many=True)
    correct = Answer_OptionsSerializer()
    class Meta:
        model = Quiz_Question
        fields = ('url', 'text', 'possible_answers', 'correct')

    def create(self, validated_data):
        possible_answers_data = validated_data.pop('possible_answers')
        correct_answers_data = validated_data.pop('correct')
        quiz_question = Quiz_Question.objects.create(**validated_data)
        if possible_answers_data:
            for answer in possible_answers_data:
                answer, created  = Answer_Options.objects.get_or_create(text=answer['text'])     
                if (answer.text == correct_answers_data['text']):
                    quiz_question.correct = answer     //Not sure why this is not getting saved                          
                quiz_question.possible_answers.add(answer)
        return quiz_question

Что происходит, когда я публикую данные через Django Rest Framework, вызывается метод create и сохраняются возможные ответы, но я не знаю, почему правильный ответ не сохраняется для этого экземпляра.


Я не получаю никаких ошибок или исключений. Также я вижу правильный ответ на странице создания нового объекта Django Rest Frameworks. Но когда я щелкаю страницу сведений об этом объекте, я вижу нулевое значение для правильного ответа.
Любая подсказка, что я делаю не так?

Пример данных JSON, которые я публикую, выглядит так: -

{
    "text": "Google Headquarters are in?",
    "possible_answers": [
       {
            "text": "USA"
        },
        {
            "text": "Nort Korea"
        },
        {
            "text": "China"
        },
        {
            "text": "India"
        }
],
    "correct": {
        "text": "USA"
    }
}

1 Ответ

0 голосов
/ 09 мая 2018

Вам нужно позвонить save() после изменения correct значения:

def create(self, validated_data):
    possible_answers_data = validated_data.pop('possible_answers')
    correct_answers_data = validated_data.pop('correct')
    quiz_question = Quiz_Question.objects.create(**validated_data)
    if possible_answers_data:
        for answer in possible_answers_data:
            answer, created  = Answer_Options.objects.get_or_create(text=answer['text'])    
            if answer.text == correct_answers_data['text']:
                quiz_question.correct = answer   
                quiz_question.save() # save changes
            quiz_question.possible_answers.add(answer)
    return quiz_question
...