【问题标题】:DRF create user in nested serializerDRF 在嵌套序列化程序中创建用户
【发布时间】:2016-03-22 20:43:14
【问题描述】:

大家好,我正在尝试通过 API 在 django rest 框架中使用嵌套序列化程序创建用户,但我遇到了一些问题:

这是我的代码:

class AffiliateRegisterSerializer(serializers.ModelSerializer):

class Meta:
    model = Affiliate
    fields = ('phone','address','state','city','ZIP','country','company','web_name','web_url','web_desc','payee_name','monthly_visits',)

还有我的第二个序列化器:

class UserSerializer(serializers.ModelSerializer):

    '''
        Registering a new user with Affiliate Profile
    '''

    affiliate = AffiliateRegisterSerializer(required=False)

    class Meta:
        model = User
        fields = ('username','first_name','last_name','email','password','affiliate',)
        write_only_fields = ('password',)
        read_only_fields = ('id','affiliate',)

    def create(self, validated_data):
        affiliate_data = validated_data.pop('affiliate')
        user = User.objects.create_user(**validated_data)
        Affiliate.objects.create(user=user, **affiliate_data)
        return user

这是我的观点:

class AffiliateSignUp(generics.CreateAPIView):
    '''
        API endpoint for Affiliate Users registration
    '''

    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [permissions.AllowAny]

    @method_decorator(ensure_csrf_cookie)
    @method_decorator(csrf_protect)
    def create(self, request):
            serializer = UserSerializer(data=request.data)

            if serializer.is_valid():
                    serializer.save()
                    return JsonResponse(serializer.data, status=201)
            return JsonResponse(serializer.errors, status=400)

如何通过 AngularJS 发送 POST 请求以立即创建用户和配置文件?

我正在尝试通过 AngularJs 发布一个嵌套对象,但它说:

affiliate: ["此字段为必填项。"]

如果我直接从后端通过 url: /api/affilaite 它注册用户非常好,但我在这里苦苦挣扎的唯一问题是,

如何在 javascript 中发送带有嵌套对象的 POST 请求。

这是我的 javascript 代码:

data:$httpParamSerializerJQLike({
                'first_name':$scope.userData['first_name'],
                'last_name':$scope.userData['last_name'],
                'username':$scope.userData['username'],
                'password':$scope.userData['password'],
                'email':$scope.userData['email'],
                affiliate:{
                'phone':$scope.userData['phone'],
                'address':$scope.userData['address'],
                'state':$scope.userData['state'],
                'city':$scope.userData['city'],
                'ZIP':$scope.userData['ZIP'],
                'country':$scope.userData['country'],
                'company':$scope.userData['company'],
                'web_url':$scope.userData['webUrl'],
                'web_name':$scope.userData['webName'],
                'web_desc':$scope.userData['webDesc'],
                //'web_category':$scope.userData ['webCategory'],
                'payee_name':$scope.userData['payeeName'],
                'monthly_visits':$scope.userData['monthly_visits']
                }
              }

请帮帮我:D 我很挣扎:P

【问题讨论】:

  • 嗯。这很奇怪。看起来您正在有效载荷中发送affiliate。您可以在视图中打印request.data 以验证其中的内容吗?
  • 附属[ZIP]:“1230”附属[地址]:“balindollska bb”附属[城市]:“Gostivar”附属[公司]:“Maxleads”附属[国家]:“马其顿”附属[monthly_visits]:“132523”附属[payee_name]:“gentz”附属[电话]:“71666022”附属[州]:“马其顿”附属[web_desc]:“附属营销网络”附属[web_name]:“Maxleads”附属[web_url]:“maxleads.net”电子邮件:“gentz@gentz.com”名字:“龙胆”姓氏:“Elmazi”密码:“gentz”用户名:“gentz”
  • 具体数据是什么?你能更新答案吗?
  • 确切的数据是什么意思?
  • 请粘贴print(request.data)的确切内容。您在上面粘贴的不是有效数据。

标签: javascript angularjs django django-rest-framework


【解决方案1】:

已解决

问题是我正在发送一个 QueryDict 应用程序/x-www-form-urlencoded

所以我从前端改变了

method:'POST',
            url:'/api/URL/',
            headers: {'Content-Type': 'application/json'},
            dataType: 'json',

然后我发送一个嵌套对象。

所以这确实会立即创建一个具有用户个人资料的用户。

感谢大家的支持

【讨论】:

    【解决方案2】:

    您在序列化程序Meta 中将affiliate 设为只读:read_only_fields = ('id','affiliate',)

    只读

    API 输出中包含只读字段,但不应包含 在创建或更新操作期间包含在输入中。任何 序列化程序中错误包含的“read_only”字段 输入将被忽略。

    将此设置为 True 以确保在序列化一个 表示,但在创建或更新实例时不使用 在反序列化期间。

    默认为假

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多