代码之家  ›  专栏  ›  技术社区  ›  Sunny Chaudhari

如何从一个序列化程序调用序列化程序的create()方法

  •  10
  • Sunny Chaudhari  · 技术社区  · 9 年前

    我有两个序列化程序,“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请求访问用户api时,它调用UserSerializer的创建方法,该方法保存用户对象。

    现在,在保存用户的同时,我还想使用用户api保存客户对象。因此,对于UserSerializer的create方法,我想调用CustomerSerializer的create()方法来保存客户对象。我该怎么做?

    2 回复  |  直到 9 年前
        1
  •  16
  •   Edwin Lunando    9 年前

    你可以打电话给 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__'
    
        2
  •  5
  •   Sunny Chaudhari    9 年前

    @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保存对象之前需要此条件

    我添加了“数据”,这是我需要为客户数据字段验证的dict,

    因为正如我之前解释的,这是POST请求,所以我正在发送一些数据,这些数据是使用UserSerializer存储用户所必需的,而一些数据是使用一个用户api本身使用CustomerSerialize存储客户所必需的。

    因此,“get_serializer_context”方法给出了整个请求后数据,从中我只得到了保存客户所需的字段,并将该dict作为参数传递给CustomerSerializer

    “customer_serializer=CustomerSerializer(data=cust_req_data)”

    这对我有用。

    推荐文章