【问题标题】:How to call serializer's create() method from one serializer如何从一个序列化程序调用序列化程序的 create() 方法
【发布时间】:2017-06-03 18:11:24
【问题描述】:

我有两个序列化器,“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() 方法来保存客户对象。我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    您可以从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__'
    

    【讨论】:

      【解决方案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__'
      

      还有“if customer_serializer.is_valid():”在使用 CustomerSerializer 保存对象之前需要此条件

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

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

      所以“get_serializer_context”方法提供了整个发布请求数据,我只获得了保存客户所需的那些字段,并且我已将该字典作为参数传递给 CustomerSerializer

      “customer_serializer = CustomerSerializer(data=cust_req_data)”

      这对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多