2015-10-10 38 views
4

我試圖創建OneToOne場基本的CRUD操作。 不需要用戶設置的配置文件時,如何創建/更新/需要時刪除配置文件(假設用戶已經在DB)?Django的REST:創建CRUD操作OneToOne場

我的模型是從Django的REST的默認用戶模式和:

class UserProfile(models.Model): 
     user = models.OneToOneField(User) 
     location = models.CharField(max_length=50,blank=True) 
     title = models.CharField(max_length=80,blank=True) 
     #picture = models.ImageField(upload_to='user_imgs', blank=True) 
     website = models.URLField(blank=True) 

我Viewsets是:

class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    filter_fields = ['id', 'username', 'email', 'first_name', 'last_name'] 

class UserProfileViewSet(viewsets.ModelViewSet): 
    queryset = UserProfile.objects.all() 
    serializer_class = UserProfileSerializer 
    filter_fields = ['user_id', 'location', 'title', 'website'] 

而且連載:

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = User 
     email = serializers.EmailField() 
     fields = ('id','username', 'email', 'first_name', 'last_name') 


class UserProfileSerializer(serializers.HyperlinkedModelSerializer): 
    user_id = serializers.CharField(source='user.id') 

    class Meta: 
     model = UserProfile 
     fields = ('user_id', 'location','title','website') 

回答

2

要限制創建配置文件,以登錄用戶的當前我相信。您可以過濾配置文件到當前用戶的查詢集,這樣只有該用戶的個人資料將被登錄的用戶訪問。

class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    filter_fields = ['id', 'username', 'email', 'first_name', 'last_name'] 


class UserProfileViewSet(viewsets.ModelViewSet): 
    queryset = UserProfile.objects.all() 
    serializer_class = UserProfileSerializer 
    filter_fields = ['user_id', 'location', 'title', 'website'] 

    def get_queryset(self): 
     return super(UserProfileViewSet, self).get_queryset().filter(
      user=self.request.user) 

    def perform_create(self, serializer): 
     serializer.save(user=user) 

您做出user場只讀和被保存在上述方法perform_create始終分配給當前用戶。

class UserProfileSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = UserProfile 
     fields = ('user', 'location','title','website') 
     read_only_fields = ('user',) 
3

應該着重定義view如何接收請求和處理原始數據,而不是model和字段定義的。

我給你基本的操作User爲基準的CRUD例如:

魯= LibraryUser(library_membership_number = '...',USER_ID =用戶)

class ExampleAPIView(APIView): 
    def get(self, request): 
     username = request.query_params.get('username', '') 
     user = User.objects.get(username=username) 
     return Response(ExampleSerializer(user).data) 

    def post(self, request): 
     username = request.data.get('username', '') 
     email = request.data.get('email', '') 
     password = request.data.get('password', '') 
     user = User.objects.create_user(username=username, email=email, password=password) 
     user.save() 
     Response({'status': 'ok'}}) 

    def put(self, request): 
     username = request.data.get('username', '') 
     old_password = request.data.get('old_password', '') 
     new_password = request.data.get('new_password', '') 
     user = authenticate(username=username, password=old_password) 
     if not user: 
      return Response({'status': 'fail'}}) 
     user.set_password(new_password) 
     return Response({'status': 'ok'}}) 

    def delete(self, request): 
     username = request.query_params.get('username', '') 
     user.objects.get(username=username).delete() 
     return Response({'status': 'ok'}}) 

雅閣的例子,這是我對每一種方法的定義:

  • GET:檢索用戶配置文件

  • POST:創建一個新用戶

  • PUT:更改密碼的用戶

  • DELETE:刪除用戶

所以,將實施user基本CRUD API實例。

我希望它可以幫助你如何設計的API。


如果你不明白還是如何操作model,我會更多的介紹例如:

class ExampleAPIView(APIView): 
    def get(self, request): 
     username = request.query_params.get('username', '') 
     userprofile = UserProfile.objects.get(user__username=username) 
     return Response(ExampleSerializer(userprofile).data) 

    def put(self, request): 
     username = request.data.get('username', '') 
     userprofile = UserProfile.objects.get(user__username=username) 
     if not userprofile : 
      return Response({'status': 'fail'}}) 
     userprofile.location = ... 
     userprofile.title = ... 
     userprofile.website = ... 
     userprofile.save() 
     return Response({'status': 'ok'}}) 
+0

OneToOne字段在哪裏? – Mike

+0

@Mike你會參考:https://docs.djangoproject.com/en/1。8/topics/db/examples/one_to_one /#一對一關係 –

+0

同樣,我們可以證明它沒有什麼不同。 –