Вложенный сериализатор не сохраняет вложенные поля
только табличные регистры верхнего уровня;
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 поля в качестве значения, а не вложенные данные, например