我理解TastyPie的基础知识,但自定义的ModelResource方法对我来说非常困惑。我正在尝试进行PATCH api调用以更新用户的密码,并且数据未通过set_password()
方法运行,因此使用原始值而不是数据库中的HASH进行更新。这是我的ModelResource:
class UserResource(ModelResource):
class Meta:
queryset = User.objects.all()
resource_name = 'user'
excludes = ['is_active', 'is_staff', 'is_superuser']
authorization = Authorization()
detail_allowed_methods = ['get', 'post', 'put', 'delete', 'patch']
filtering = {
'username': ALL,
}
authentication = ApiKeyAuthentication()
我假设我需要在这里使用obj_update
方法,但在用户表中更新实际对象之前,我不确定如何格式化此方法以通过set_password
方法运行密码。
答案 0 :(得分:4)
你应该使用hydrate方法来处理这个raw_password以便为所有情况(POST,PUT,PATCH)进行哈希转换。我个人定义了一个虚拟字段raw_password
,以免引起命名空间冲突,因为Tastypie允许你从GET请求中获得POST / PUT / PATCH对象(除了是一个好习惯):
def hydrate(self, bundle):
if bundle.data.has_key('raw_password'):
u = User(username='dummy')
u.set_password(bundle.data['raw_password'])
bundle.data['password'] = u.password
return bundle