2016-07-22 160 views
3

我有一個鏈接使用兩條Django模型:如何在Django REST框架中爲POST請求設置權限?

class ParentModel(models.Model): 
    creator = models.ForeignKey(User, related_name='objects') 
    name = models.CharField(max_length=40) 

class ChildModel(models.Model): 
    parent = models.ForeignKey(ParentModel, related_name='child_objects') 
    name = models.CharField(max_length=40) 

現在,兒童模型製作視圖集中的時候,我想它,如果它的父被認爲是創造相同的用戶創建僅創建子實例。那我包括在我的ChildViewSet(viewsets.ModelViewSet)權限類看起來是這樣的:

class IsOwner(permissions.BasePermission): 
    def has_object_permission(self, request, view, obj): 
     if request.method in permissions.SAFE_METHODS: 
      return True 
     return obj.parent.creator == request.user 

這似乎只是正常工作當我使用PATCH方法,但似乎POST方法不當時我明確地察覺這種權限類POST方法設置return False

我在做什麼錯誤,以及如何解決它?

回答

0

很難知道肯定沒有看到你的網址和意見,但請看看BasePermission實現的默認方法,你繼承:

def has_permission(self, request, view): 
    """ 
    Return `True` if permission is granted, `False` otherwise. 
    """ 
    return True 

def has_object_permission(self, request, view, obj): 
    """ 
    Return `True` if permission is granted, `False` otherwise. 
    """ 
    return True 

對於PATCH你與已經存在的對象工作,然後進入已覆蓋的自定義方法 - 確定!對於POST,您可能會掛鉤到另一個,因爲您正在創建一個新對象。

因此,請在您的派生類中嘗試執行has_permission

1

感謝wim爲我提供了一個答案的提示!

我的權限沒有與POST請求一起工作的原因實際上是該對象尚未創建,所以我應該在我的權限類中使用has_permission。這裏是代碼爲我工作:

def has_permission(self, request, view): 
    user_id = getattr(request.user, 'id') 
    parent_id = request.data['parent'] 
    if parent_id is not None: 
     parent_obj = ParentModel.objects.get(id=parent_id) 
     serialized = ParentSerializer(association) 
     return user_id == serialized.data['creator'] 
    return False 
+0

感謝您的支持!我設法調整了我正在做的事情。 – whoisearth