AttributeError: Объект сериализатора не имеет атрибута 'initial_data', при попытке отправить новый запрос к вложенному сериализатору в DjangoRestFramework

Я пытаюсь создать два экземпляра модели из одного почтового запроса. Модель2 связана с моделью1 с помощью поля ForeignKey. Модель1 также имеет validate() в своем сериализаторе. Проблема в том, что когда я использую вложенный сериализатор для сохранения обоих экземпляров модели вместе, функция validate модели Model1 возвращает ошибку AttributeError: 'Model1Serializer' object has no attribute 'initial_data'.

Согласно документации DRF

Если аргумент ключевого слова 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.

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