如何从一个序列化程序调用序列化程序的 create() 方法
How to call serializer's create() method from one 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 的创建方法来保存用户对象。
现在,在保存用户的同时,我还想使用用户 api 保存客户对象。因此,对于 UserSerializer 的创建方法,我想调用 CustomerSerializer 的 create() 方法来保存客户对象。我该怎么做?
您可以从 UserSerializer
中的 create
方法调用 CustomerSerializer
。例如
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__'
@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__'
另外 "if customer_serializer.is_valid():" 在使用 CustomerSerializer 保存对象之前需要这个条件
我添加了 "data" 这是我需要验证我的客户数据字段的字典,
因为正如我之前所解释的那样,这是 POST 请求,我正在发送一些数据,这些数据是使用 UserSerializer 存储用户所必需的,而一些数据是使用一个用户使用 CustomerSerializer 存储客户所必需的 api本身。
所以 "get_serializer_context" 方法给出整个 post 请求数据,我只从中获取保存客户所需的那些字段,并且我已将该字典作为参数传递给 CustomerSerializer
"customer_serializer = CustomerSerializer(data=cust_req_data)"
这对我有用。
我有两个序列化程序,"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 的创建方法,我想调用 CustomerSerializer 的 create() 方法来保存客户对象。我该怎么做?
您可以从 UserSerializer
中的 create
方法调用 CustomerSerializer
。例如
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__'
@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__'
另外 "if customer_serializer.is_valid():" 在使用 CustomerSerializer 保存对象之前需要这个条件
我添加了 "data" 这是我需要验证我的客户数据字段的字典,
因为正如我之前所解释的那样,这是 POST 请求,我正在发送一些数据,这些数据是使用 UserSerializer 存储用户所必需的,而一些数据是使用一个用户使用 CustomerSerializer 存储客户所必需的 api本身。
所以 "get_serializer_context" 方法给出整个 post 请求数据,我只从中获取保存客户所需的那些字段,并且我已将该字典作为参数传递给 CustomerSerializer
"customer_serializer = CustomerSerializer(data=cust_req_data)"
这对我有用。