Вложенный сериализатор не сохраняет вложенные поля

только табличные регистры верхнего уровня;

models.py

from django.db import models

class FormularModel(models.Model):
    title = models.CharField(max_length=255, blank=False, null=False)
    created_by = models.IntegerField(blank=True, null=True)
    created_at = models.DateTimeField(
        db_column="creation_date",
        auto_now_add=True
    )
    class Meta:
        app_label = 'my_data_base'
        db_table = "formular"


class QuestionModel(models.Model):
    formular = models.OneToOneField(FormularModel, related_name='formular', on_delete=models.CASCADE,)
    title = models.CharField(max_length=255, blank=True, null=True)
    field_type = models.CharField(max_length=255, blank=True, null=True)
    update_by = models.IntegerField(blank=True, null=True)
    update_at = models.DateTimeField(
        db_column="my_data_base",
        auto_now_add=True
    )
    class Meta:
        app_label = 'my_data_base'
        db_table = "question"

class ResponseModel(models.Model):
    question = models.OneToOneField(QuestionModel, related_name='question', blank=True, null=True, on_delete=models.CASCADE,)
    values = models.CharField(max_length=255, blank=True, null=True)

    update_by = models.IntegerField(blank=True, null=True)
    update_at = models.DateTimeField(
        db_column="update_date",
        auto_now_add=True
    )
    class Meta:
        app_label = 'my_data_base'
        db_table = "response"

class FieldcontentModel(models.Model):
    questions = models.OneToOneField(QuestionModel, related_name='questions', on_delete=models.CASCADE,)
    values = models.CharField(max_length=255, blank=True, null=True)
    place = models.IntegerField(blank=False)
    
    update_by = models.IntegerField(blank=True, null=True)
    update_at = models.DateTimeField(
        db_column="update_date",
        auto_now_add=True
    )
    class Meta:
        app_label = 'my_data_base'
        db_table = "field"

serilizers.py

from .models import *
from rest_framework import serializers
from drf_writable_nested.serializers import WritableNestedModelSerializer



class ResponseSerializer(serializers.ModelSerializer):
    
    class Meta():
        model = ResponseModel
        fields = ['id', 'values']


class FieldSerializer(serializers.ModelSerializer):
    values = serializers.CharField()
    place = serializers.CharField()
    class Meta():
        model = FieldcontentModel
        fields = ['id', 'values', 'place']


class QuestionSerializer(serializers.ModelSerializer):
    title = serializers.CharField()
    field_type = serializers.CharField()
    
    fieldcontent = FieldSerializer(many=True, allow_empty=False)
    response = ResponseSerializer(many=True, allow_empty=False)
    class Meta():
        model = QuestionModel
        fields = ['id', 'title', 'field_type', 'fieldcontent', 'response']

    def create(self, validated_data):
        fields_data = validated_data.pop('fieldcontent')
        responses_data = validated_data.pop('response')
        print('validated_data', validated_data)
        question = QuestionModel.objects.create(**validated_data)
        for field_data in fields_data:
            print('field_data;',field_data)
            FieldcontentModel.objects.create(question=question, **field_data,)
        if not responses_data:
            for response_data in responses_data:
                print('response_data;',response_data)
                ResponseModel.objects.create(question=question, **response_data,)
        return question


class FormularSerializer(serializers.ModelSerializer):
    # question = serializers.StringRelatedField(many=True)
    question = QuestionSerializer(many=True, allow_empty=False)
    class Meta():
        model = FormularModel
        fields = ['id', 'title', 'question']

    def create(self, validated_data):
        questions_data = validated_data.pop('question')
        formular = FormularModel.objects.create(**validated_data)
        for question_data in questions_data:
            print(question_data)
            QuestionModel.objects.create(formular=formular, **question_data,)
        return formular

views.py

def create(self, request):
        
    formularSerializer = FormularSerializer(data=request.data)

    # Serialization
    formularSerializer.is_valid(raise_exception=True)

    # Get Datas from front 
    title = formularSerializer.validated_data["title"]

    # check if recormodel exist
    num = FormularModel.objects.all().filter(
        title = title,
        created_by = id).count()
    if num >= 1:
        return Response(
        {
         'message': 'already exit.',
         'status': 'warning',
       },
      status=status.HTTP_409_CONFLICT)
            
     else:
         formularSerializer.save(created_by = id) 
         return Response(
         {
           'status': 'create',
           'code': status.HTTP_201_CREATED,
         },
         status=status.HTTP_201_CREATED)        

console

Traceback (most recent call last):
  File "/env/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/env/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/env/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/env/lib/python3.10/site-packages/rest_framework/viewsets.py", line 125, in view
    return self.dispatch(request, *args, **kwargs)
  File "/env/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/env/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/env/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/env/lib/python3.10/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/exercice/views.py", line 93, in create
    formularSerializer.save(created_by = id)
  File "/env/lib/python3.10/site-packages/rest_framework/serializers.py", line 212, in save
    self.instance = self.create(validated_data)
  File "/exercice/serializers.py", line 63, in create
    QuestionModel.objects.create(formular=formular, **question_data,)
  File "/env/lib/python3.10/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/env/lib/python3.10/site-packages/django/db/models/query.py", line 512, in create
    obj = self.model(**kwargs)
  File "/env/lib/python3.10/site-packages/django/db/models/base.py", line 559, in __init__
    raise TypeError(
TypeError: QuestionModel() got an unexpected keyword argument 'fieldcontent'

требование

djangorestframework==3.13.1

python3.10

вот что я отправляю почтовым методом ** { "title": "string5", "question": [ { "title": "string", "field_type": "string", "fieldcontent": [ { "значения": "string", "место": 1 } ], "response": [ { "значения": "string" } ] } ] } **

Только формула сохраняется в базе данных my_data_base

если есть более простой способ сделать это с помощью drf-writable-nested==0.7.0 скажите мне пожалуйста Я следовал этой документации. Спасибо

fieldcontent не существует в модели QuestionModel

когда вы хотите использовать вложенный сериализатор для модели, он должен содержать поле отношения как ForeignKey или ManyToMany, также вы разворачиваете отношение в вашем сериализаторе

проверьте модель Neseted Serializer в DjangoRestFramework doc, потому что когда вы используете отношение OneToOne, вы должны передавать только id поля в качестве значения, а не вложенные данные, например

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