我需要在hydrate方法中获得授权的用户对象,类似的东西:
class SalepointResource(ModelResource):
def hydrate(self, bundle):
user = bundle.request.user
但是请求这里是空的 HttpRequest 对象,并且没有用户方法,尽管用户已获得授权。有没有办法获取用户对象?
答案 0 :(得分:0)
您是否在tastypie中正确设置了身份验证/授权?
答案 1 :(得分:0)
不确定这是否是最佳方法,但我通过继承ModelResource
类并重写其某些方法来解决这个问题。在ModelResource
中,request
对象(包含user
)是obj_update
方法的参数,但不会传递给full_hydrate
方法,转过来hydrate
。您必须对每个方法进行一些小的更改,以便将request
对象一直传递到链中。
方法修改是微不足道的。详细说明:
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, ValidationError
from tastypie.resources import ModelResource
from tastypie.exceptions import NotFound, BadRequest, InvalidFilterError, HydrationError, InvalidSortError, ImmediateHttpResponse
class MyModelResource(ModelResource):
def obj_create(self, bundle, request=None, **kwargs):
...
bundle = self.full_hydrate(bundle, request)
...
def obj_update(self, bundle, request=None, **kwargs):
...
bundle = self.full_hydrate(bundle, request)
...
def full_hydrate(self, bundle, request=None):
...
bundle = self.hydrate(bundle, request)
...
def hydrate(self, bundle, request=None):
...
return bundle
然后将您的资源设为此新类的子类并覆盖新版hydrate
:
class MyModelResource(MyModelResource):
class Meta:
queryset = MyModel.objects.all()
def hydrate(self, bundle, request):
bundle.obj.updated_by_id = request.user.id
return bundle
我没有彻底测试过,但到目前为止似乎有效。希望它有所帮助。
答案 2 :(得分:0)
使用TastyPie 0.9.15,我发现这有效:
def hydrate_user(self, bundle):
bundle.obj.user = bundle.request.user
return bundle
不需要子类ModelResource
。此处user
是模型和资源的ForeignKey
。
我发布这个作为答案,因为虽然看起来很简单,但我花了很长时间才弄明白。