2013-06-03 88 views
1

我有一個像防止tastypie從更新外鍵字段

class MembershipResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user')  
    activity = fields.ForeignKey(ActivityResource, 'activity') 
    class Meta: 
     authorization=Authorization() 
     authentication=ApiKeyAuthentication() 

現在tastypie資源,這不過效果很好,當我做了後該資源與數據

{ 
user: "/api/v1/user/username/", 
activity: "/api/v1/activity/2/" 
} 

,如果我使用用戶名,身份證等傳遞完整的用戶數據,TastyPie更新auth_user並更改身份驗證細節(我無法與用戶登錄,直到我在django shell中重置密碼)

有沒有簡單方法,使fields.ForeignKey(ForeignResource)以防止更新ForeignResource

編輯:

我可以通過使用特定領域水合物做到這一點。例如:

def hydrate_user(self, bundle): 
    user = UserNameResource() 
    userbundle = user.build_bundle(data=bundle.data['user'], request=bundle.request) 
    userobj = user.full_hydrate(userbundle).obj   
    bundle.data['user'] = userobj     
    return bundle 

甚至通過使用稱爲user_id的僞字段。但是,我認爲這是一個非常普遍的問題,並且必須通過field.ForeignKey中的選項來實現這個更簡單的方法。

+0

你能不能排除在user表中特定的字段? – karthikr

+0

我需要鏈接現有的用戶。所以,我不能排除這個領域。我已經編輯了更多信息的問題。謝謝。 – Sundar

回答

0

如果你肯定知道你不想更新用戶領域,你可以在現場使用只讀PARAM。

user = fields.ForeignKey(UserResource, 'user', readonly=True) 
+0

我也嘗試過這個選項。 「只讀」選項不允許設置資源的外鍵值。 – Sundar

+0

好的。所以不要傳遞所有的用戶數據。僅傳遞用戶標識。 – ge7600

+0

是的。如果我只傳遞資源URI,那沒問題。但是,如果我傳遞的是用戶對象而不是URI,則外部字段資源(本例中爲用戶)正在更新。我將此更新追溯到ModelResource類的「save_related」函數。我將在GitHub中提出這個問題。 – Sundar