AttributeError: Объект сериализатора не имеет атрибута 'initial_data', при попытке отправить новый запрос к вложенному сериализатору в DjangoRestFramework
Я пытаюсь создать два экземпляра модели из одного почтового запроса. Модель2 связана с моделью1 с помощью поля ForeignKey. Модель1 также имеет validate() в своем сериализаторе. Проблема в том, что когда я использую вложенный сериализатор для сохранения обоих экземпляров модели вместе, функция validate модели Model1 возвращает ошибку AttributeError: 'Model1Serializer' object has no attribute 'initial_data'.
Если аргумент ключевого слова data не передан, то
.initial_dataне будет существовать.
Триалы: Я пробовал перехватывать поток в __init__() и validate() CombinedSerializer, но похоже, что сначала оценивается validate() Model1Serializer.
Сомнение: Почему Model1Serializer не получает аргумент ключевого слова data и как я могу исправить свой код? На каком этапе оценивается функция Model1Serializer validate()?
Модели:
from django.db import models
class Model1(models.Model):
key1 = models.PositiveIntegerField(blank=False, null=False)
def __str__(self):
return self.key1
class Model2(models.Model):
foreign_key = models.ForeignKey('Model1', blank=True, null=True, on_delete=models.CASCADE)
key2 = models.CharField(max_length=20)
def __str__(self):
return self.key2
Сериализаторы:
from rest_framework import serializers
from .models import Model1, Model2
class Model1Serializer(serializers.ModelSerializer):
def validate(self, data):
if(self.initial_data['key1']>=10):
data['key1'] = self.initial_data['key1'] + 1
return data
else:
data['key1'] = self.initial_data['key1']
return data
class Meta:
model = Model1
fields = '__all__'
class Model2Serializer(serializers.ModelSerializer):
class Meta:
model = Model2
fields = '__all__'
class CombinedModelSerializer(serializers.ModelSerializer):
model1 = Model1Serializer()
model2 = Model2Serializer()
def create(self, validated_data):
model2_data = validated_data.pop('model2')
model1 = Model1.objects.create(**validated_data)
model2 = Model2.objects.create(foreign_key=model1.id, **model2_data)
return model1
class Meta:
model = Model1
fields = '__all__'
Просмотров:
from django.shortcuts import render
from rest_framework import generics
from .models import Model1, Model2
from .serializers import Model1Serializer, Model2Serializer, CombinedModelSerializer
class Model1List(generics.ListCreateAPIView):
queryset = Model1.objects.all()
serializer_class = Model1Serializer
class Model2List(generics.ListCreateAPIView):
queryset = Model2.objects.all()
serializer_class = Model2Serializer
class CombinedList(generics.ListCreateAPIView):
queryset = Model1.objects.all()
serializer_class = CombinedModelSerializer
Пост запрос:
POST: http://127.0.0.1:8000/combined/
{
"model1":
{
"key1": 45
},
"model2": {
"key2": "val2"
}
}
Версии пакетов:
Python==3.6.8
Django==2.2.4
djangorestframework==3.10.3
initial_data существует только тогда, когда вы передаете data в конструктор Model1Serializer.
Но в views.py вы его не передали.
Так что если вы хотите использовать initial_data, пожалуйста, передайте эти данные. Если они вам не нужны, вам нужно удалить их в теле функции validate.