2016-03-07 48 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獲取更多信息。