2016-03-07 53 views
1

作为回应,我只获取发布数据的可读字段。我想要返回主键和用户名。在Django rest框架中发布数据后如何返回主键作为响应?

serializers.py:

class UserCreateSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     fields = ('id', 'username', 'full_name', 'email','password',) 
     extra_kwargs = { 
        'password': 
         { 
         'write_only': True, 
         'required': False 
         } 
        } 
     read_only_fields = ('username',) 

views.py:

class UserCreate(UserMixin, generics.CreateAPIView): 
    serializer_class = UserCreateSerializer 

    def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 

     if serializer.is_valid(): 
      User.objects.create_user(**serializer.validated_data) 
      email = serializer.validated_data.get('email', None) 
      password = serializer.validated_data.get('password', None) 
      user = authenticate(email=email, password=password) 
      login(request, user) 
      headers = self.get_success_headers(serializer.data) 
      return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) 

     return Response({ 
      'status': 'Bad request', 
      'message': 'Account could not be created with received data.' 
     }, status=status.HTTP_400_BAD_REQUEST) 
+0

我认为看到你的UserCreateSerializer代码会告诉服务返回什么可能会有帮助。 – themanatuf

+0

更新了代码。对不起,以前没有提及。 –

回答

1

两件事。您希望在返回之前保存用户,因为PK在保存时生成。你也想序列化用户对象,而不是返回POST数据。因此,在您创建()的结尾,您想要类似于

 
... 
user.save() 
response_data = UserCreateSerializer(user).data 
return Response(response_data, status... 

也就是说,您确定要自动登录新创建的用户。看起来很奇怪。

+0

对于自动登录,我没有看到任何问题,因为像FB和Twitter这样的网站也做同样的事情。发布任何内容之前都需要验证电子邮件。 –

0

User.objects.create_user()

返回用户模型的一个实例。你想用它这样得到的主键:

user = User.objects.create_user(**serializer.validated_data) 
    user.save() 
    pk = user.pk 

你需要调用保存()自行告诉Django,它现在应该坚持,否则这将在稍后进行。

查看django docs获取更多信息。