How to get authorized user object in django-tastypie

回眸只為那壹抹淺笑 提交于 2019-12-05 19:27:46

With TastyPie 0.9.15, I find this works:

def hydrate_user(self, bundle):
    bundle.obj.user = bundle.request.user
    return bundle

with no need for subclassing ModelResource. Here user is a ForeignKey of the model and the resource. I'm posting this as an answer because although it looks simple, it took me a long time to figure out.

Have you set up authentication/authorization properly in tastypie?

Not sure if this is the best approach, but I got around this problem by subclassing the ModelResource class and overriding some of its methods. In ModelResource the request object (which contains user) is a parameter to the obj_update method but it is not passed on to the full_hydrate method, which in turn calls hydrate. You have to make a few small changes to each of these methods to pass the request object all the way down the chain.

The method modifications are trivial. In detail:

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

Then make your resource a subclass of this new class and override the new version of 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

I haven't tested this thoroughly but it seems to work so far. Hope it helps.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!