2

У меня есть два сериализаторов, «UserSerializer» и «CustomerSerializer» как нижеКак звонить сериалайзер Создать() метод из одного сериализатора

class UserSerializer(serializers.ModelSerializer): 

    def create(self, validated_data): 
     return User.objects.create(**validated_data) 

    class Meta: 
     model = User 
     fields = '__all__' 


class CustomerSerializer(serializers.ModelSerializer): 

    def create(self, validated_data): 
     return Customer.objects.create(**validated_data) 

    class Meta: 
     model = Customer 
     fields = '__all__' 

Когда я ударил пользователь апи с запросом POST, он вызывает метод создания UserSerializer, который сохраняет объект пользователя.

Теперь, сохраняя пользователя, я также хочу сохранить объект клиента, используя user api. Поэтому для метода создания UserSerializer я хочу вызвать метод create() CustomerSerializer для сохранения объекта клиента. Как мне это сделать ?

ответ

2

Вы можете позвонить по телефону CustomerSerializer из create внутри UserSerializer. НАПРИМЕР.

class UserSerializer(serializers.ModelSerializer): 

    def create(self, validated_data): 
     customer_serializer = CustomerSerializer(validated_data.get('customer')) 
     customer_serializer.save() 
     return User.objects.create(**validated_data) 

    class Meta: 
     model = User 
     fields = '__all__' 
+0

Спасибо @Edwin !! Это отлично работает для меня, только я внесли некоторые изменения, чтобы решить некоторые проблемы, и вы можете найти точное описание и рабочий код в моем нижнем фрагменте кода. Благодаря ! –

+0

Приятно слышать, что @SunnyChaudhari, пожалуйста, примите его в качестве ответа и поддержите его. Благодаря! –

+0

Конечно. Пожалуйста, сделайте то же самое для моего ответа. Благодаря!! –

2

@Edwin ... Решение идеально подходит только то, что я сделал некоторые изменения в моем словаре данных и отправить его в «CustomerSerializer», как показано ниже, и он начал работать. Спасибо за вашу помощь, и теперь для меня работает код.

class UserSerializer(serializers.ModelSerializer): 
    def get_serializer_context(self): 
     return self.context['request'].data 

    def create(self, validated_data): 

     request_data = dict(self.get_serializer_context()) 

     cust_req_data = {'first_name':request_data['first_name'][0], 
         'last_name':request_data['last_name'][0], 
         'email':request_data['email'][0] 
         } 

     customer_serializer = CustomerSerializer(data=cust_req_data) 
     if customer_serializer.is_valid(): 
      customer_serializer.save() 

     return User.objects.create(**validated_data) 

class Meta: 
    model = User 
    fields = '__all__' 


class CustomerSerializer(serializers.ModelSerializer): 

    def create(self, validated_data): 
     return Customer.objects.create(**validated_data) 

    class Meta: 
     model = Customer 
     fields = '__all__' 

Кроме того, «если customer_serializer.is_valid():» это условие необходимо перед сохранением объекта с использованием CustomerSerializer

Я добавил «данные», который ДИКТ, который мне нужно проверить для моих полей данных клиентов,

Поскольку, как я уже объяснял ранее, это запрос POST. Я отправляю некоторые данные, которые необходимы для хранения пользователя с помощью UserSerializer, и некоторые данные необходимы для хранения клиента с помощью CustomerSerializer, используя один пользовательский api.

так «get_serializer_context» метод дает все данные после запроса из что я получаю только те поля, которые необходимы для сохранения клиента и я прошел, что ДИКТ в качестве параметра CustomerSerializer

«customer_serializer = CustomerSerializer (данные = cust_req_data) "

Это работает для меня.