如何从一个序列化程序

时间:2017-01-19 06:24:17

标签: django django-models django-rest-framework django-serializer

我有两个序列化程序,“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的create方法来保存用户对象。

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

2 个答案:

答案 0 :(得分:7)

您可以通过CustomerSerializer内的create方法拨打UserSerializer。 E.G。

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__'

答案 1 :(得分: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"方法给出了整个post请求数据,我只获得了保存客户所需的那些字段,并且我已将该dict作为参数传递给CustomerSerializer

" customer_serializer = CustomerSerializer(data = cust_req_data)"

这对我有用。