2016-02-14 134 views
1

假設我們只想更新stage整數字段低於3的那些對象。(或者類似的例子,我們想限制對象更新的權限僅限於Owner擁有者=字段。外鍵)。所以,第一個例子中的授權將是這樣的:Tastypie授權不完全授權?

class RecordAuthorization(Authorization): 
    def update_detail(self, object_list, bundle): 
     if bundle.obj.stage < 3: 
      return True 
     raise Unauthorized("You can't update this") 

或第二個例子:

class RecordAuthorization(Authorization): 
    def update_detail(self, object_list, bundle): 
     if bundle.obj.user == bundle.request.user: 
      return True 
     raise Unauthorized("You can't update this") 

其實他們都沒有將工作(我測試的第一個和它不工作)。 當你仔細觀察到tastypie文件,他們說:

object_list中是被處理爲 請求的一部分對象的集合。

所以這意味着在object_list,有json對象只改寫爲python list of dicts?因此,有沒有從數據庫中的實物,因此這種過濾:

def update_list(self, object_list, bundle): 
    return object_list.filter(stage__lt=3) 

不會如預期(僅限於具有舞臺低於3對象允許更新)工作。並且將執行類似於 - >如果json(通過API發送,而不是數據庫中的對象)階段低於3,則允許更新。所以實際上你可以更新stage = 5(在數據庫中)stage = 1的對象! 我也得到了與update_detail函數相同的奇怪結果。所以我懷疑bundle.obj也是對象,但已經具有「json-updated」屬性。

所以要使事情工作,我需要這樣做:?!

class RecordAuthorization(Authorization): 
    def update_detail(self, object_list, bundle): 
     if User.objects.get(pk=bundle.obj.user.pk) == bundle.request.user: 
      return True 
     raise Unauthorized("You can't update this") 

回答

0

對於update_list,所述object_list參數將是需要被過濾的一個查詢集(或其它可迭代用於非Django的ORM數據源)。

對於update_detail,您想要檢查bundle.obj的屬性,它是您的Resource.Meta.object_class的一個實例,如Django模型。如果你設置Resource.Meta.querysetResource.Meta.object_class是爲你設置的。

您的代碼中存在縮進錯誤,您應該在方法級別而不是類級別提高未經授權。如果修復不能解決問題,請發佈您的資源。

+0

我現在修正了縮進。我知道object_list將是一個查詢集,bundle.obj將是Model實例(對於我來說 - Django ORM)。問題是update_list/detail中的object_list和bundle.obj都包含來自數據庫的數據並且來自當前請求=> API調用中指定的字段將覆蓋數據庫中的字段。對我而言(我認爲對於一些人來說),這是一個意想不到的行爲。我個人認爲在這些方法中會有兩個數據:來自數據庫的數據和來自api調用的數據(缺少字段數據庫補充) – Adam

+0

但我只獲得後一類數據。當然,我可以自己查詢數據庫,但由於tastypie也在查詢數據庫,我認爲它也會保留數據庫中的原始模型。特別是對於update_list函數來說,查詢看起來並不重要,因爲我需要從查詢集中提取ID並使用這些ID運行另一個查詢(如果查詢集上有一個簡單的函數來重新運行它,請告訴我) – Adam

+0

我明白你在說什麼。現在我只是做另一個查詢。在下一個版本中,我將把原始對象添加到包中。這是問題:https://github.com/django-tastypie/django-tastypie/issues/1448 –