Проблема записи вложенных объектов в джанго уже подымалась, но порой все же требуется создать все через всего одну View

Начнем с моделей:

from django.db import models

class QuizQuestion(models.Model):
    text = models.TextField(verbose_name='Text', max_length=250, blank=True)

class QuizAnswer(models.Model):
    question_id = models.ForeignKey(QuizQuestion, verbose_name='question_id', related_name='answers')
    text = models.TextField(verbose_name='Text', max_length=250)

А завешим серилизаторами:

# coding=utf8

from rest_framework import serializers

class QuizAnswerSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)
    # серилизатору надо явно указать, что надо использовать ид - иначе он будет отфильтрован
    class Meta:
        model = QuizAnswer
        fields = ('id', 'text')


class QuizQuestionSerializer(serializers.ModelSerializer):
    answers = QuizAnswerSerializer(many=True)

    class Meta:
        model = QuizQuestion
        fields = ('id', 'text', 'answers')

    def create(self, validated_data):
        answers = validated_data.pop('answers', None)
        question = super(QuizQuestionSerializer, self).create(validated_data)
        # Проверка - а передавали ли вопросы
        if answers:
            for answer_data in answers:
                answer_data.pop('id', None)
                QuizAnswer.objects.create(question_id=question, **answer_data)
        return question

    def update(self, instance, validated_data):
        answers = validated_data.pop('answers', None)
        instance = super(QuizQuestionSerializer, self).update(instance, validated_data)

        if answers:
            exists_answers = QuizAnswer.objects.filter(question_id = instance)
            exists_id = []
            # цель массива собрать информацию о старых объектах - чтобы их удалить\
            # ищем объекты с ид - пробуем обновить, если нет, то создаем
            for answer_data in answers:
           
                if 'id' in answer_data and exists_answers.filter(id=answer_data['id']).exists():
                    #answer_data['question_id'] = instance
                    QuizAnswer.objects.filter(id=answer_data['id']).update(**answer_data)
                    exists_id.append(answer_data['id'])
                else:
                    answer_data.pop('id', None)
                    ans = QuizAnswer.objects.create(question_id=instance, **answer_data)
                    exists_id.append(ans.id)
            # на последок удаляем все то, что мы не прислали
            exists_answers.exclude(id__in= exists_id ).delete()

        return instance

Собственно и все. Метода удаления нету. Но и без этого на уровне моделей вложенные объекты неплохо удаляются.


Комментарии

1. Быдлокодер
14 мая 2016

Вопрос - какие данные то передавать в запросе? 
т.е. Создаем Question - 
Id, text  - всё понятно....
Если мы добавляем несколько ответов....
нам надо отправить еще несколько наборов 

id, text....
В каком виде их передавать, что бы DRF понял что это именно answers? 

2. esclkm
30 мая 2016

точно в таком же как дрф вам их присылает

смотрите сериализаторы)

Новый комментарий

Имя:
:

Смотрите также:

Нет изображения

Django Rest Framework, пишем связи

Создаем правильное JSON дерево
Нет изображения

DRF. Вложенные шаблонизаторы с возможностью записи

Изобретаем велосипед в django rest framework. Записываем вложенные объеккты
Нет изображения

Инициализация данных ModelViewSet в Django REST Framework

Задаем значения параметров вьюшки по умолчанию
Первый контакт с нами