Я пытаюсь создать доступный для записи вложенный сериализатор для моей конечной точки API, однако при входе в метод родительского сериализатора create
вложенные данные не появляются в моем validated_data
словаре, как это предполагается в примере здесь . Вместо этого вложенный ключ даже не присутствует в словаре. Вместо этого это выглядит так: {'foo': 'bar'}
. Таким образом, вложенные ключи выглядят плоскими, а любые другие вложенные объекты с такими же ключами перезаписываются.
Есть какие-нибудь подсказки, в чем может быть проблема? У меня есть довольно сложная логика проверки, однако после обрезки всего этого проблема не была исправлена, поэтому она кажется неактуальной.
Мои модели определены так:
class Payment(models.Model):
id = models.AutoField(primary_key=True)
foo = models.CharField(max_length=15, blank=True, null=True)
class Booking(models.Model):
id = models.AutoField(primary_key=True)
payment = models.ForeignKey(Payment, blank=True, null=True)
Мои сериализаторы:
class PaymentSerializer(serializers.ModelSerializer):
class Meta:
model = Payment
fields = '__all__'
class BookingSerializer(serializers.ModelSerializer):
payment = PaymentSerializer(source='*', write_only=True)
def create(self, validated_data):
print("Creating booking", validated_data) # Outputs "Creating booking {'foo': 'bar'}"
payment_data = validated_data.pop('payment') # Obviously errors at this point
primary_guest = Payment.objects.create(payment_data)
booking = Booking.objects.create(**validated_data)
# other creation related code
return booking
class Meta:
fields = '__all__'
My ViewSet:
class PrebookingViewSet(viewsets.ModelViewSet):
queryset = Booking.objects.all().order_by('id')
serializer_class = BookingSerializer
Мой запрос содержит следующее тело сообщения:
{
"payment": {
"foo": "bar"
}
}