2014-01-13 128 views
3

模型反序列化使用request.user可以說我有一個待辦事項模式是這樣的:在Django的REST框架

class ToDo(models.Model): 
    user = models.ForeignKey(UserModel) 
    text = models.CharField(max_length=255, blank=True) 

而且我用我的API Django的REST框架。由於我使用TokenAuthenticationget_queryset()用戶只能看到自己的託多斯

class ToDoResponder(viewsets.ModelViewSet): 
    authentication_classes = (TokenAuthentication,) 
    permission_classes = (IsAuthenticated,) 
    model = ToDo 
    def get_queryset(self): 
     return ToDo.objects.filter(user=self.request.user) 
    serializer_class = ToDoSerializer 

:那我也會有這樣的串行:

class ToDoSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ToDo 
     fields = ('text', 'id', 'user') 

,這爲ViewSet。不幸的是,我可以發送ToDos並僞造用戶字段,以便我可以將其他用戶的ToDo列表垃圾郵件。我不想那樣。

我怎麼能告訴django-rest-framework使用request.user特定的領域,如'用戶'在最乾燥/ pythonic的方式?畢竟這不是特別的要求,應該重複使用。

感謝

回答

2

在DRF文檔http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions你可以找到一個解決方案創建一個新的權限:在這一點上

from rest_framework import permissions 


class IsOwner(permissions.BasePermission): 
    def has_object_permission(self, request, view, obj): 
     return obj.user == request.user 

你可以在你ToDoResponder

permission_classes = (IsAuthenticated, IsOwner) 

使用它在ToDoResponder的相同頁面:

def pre_save(self, obj): 
    obj.user = self.request.user 
    super(ToDoResponder, self).pre_save(obj) 
+0

謝謝你應該工作,但我仍然在尋找另一種解決方案,因爲我想'request.user'作爲'user'的默認值,所以客戶端不必發送用戶ID。 – Harper04

+0

我剛更新了答案 –

+0

正是我想要的!一個注意事項:我必須從串行器的字段列表中刪除'user',否則pre_save()將不會被調用 – Harper04