2013-06-03 149 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